Skip to main content

Замена пользователя и email во всех коммитах

Массовая замена имени и email в истории Git-репозитория

1. Проверить всех авторов и их email

git log --format='%an <%ae>' | sort

Выведет список всех уникальных авторов и их email. Используйте этот список, чтобы убедиться, что все нужные данные попадут под замену.


2. Замена имени и email во всех коммитах (через callback)

python -m git_filter_repo --name-callback "return b'New Name'" --email-callback "return b'[email protected]'" --force
  • New Name — новое имя автора и коммиттера.

  • [email protected] — новый email.

  • --force — требуется для работы не на свежем клоне.

Пример:

python -m git_filter_repo --name-callback "return b'John Doe'" --email-callback "return b'[email protected]'" --force

3. Добавить ссылку на удалённый репозиторий

Данный пункт необходим, т.к. после выполнения git_filter_repo связь с удаленным репозиторием удаляется.

git remote add origin https://github.com/yourname/yourrepo.git

Замените на свой адрес удалённого репозитория.


4. Форсированная отправка истории в удалённый репозиторий

git push --force origin main
  • Если основная ветка называется иначе, подставьте нужное имя (например, master).


Установка git-filter-repo

Через pip (универсально, нужен Python):

pip install git-filter-repo

Через Homebrew (macOS):

brew install git-filter-repo

Проверка установки:

python -m git_filter_repo --help

Если появилась справка — всё готово.


Замена только определённых email/имён через файл mailmap

1. Создать файл my-mailmap.txt со строками замены:

New Name <[email protected]> <[email protected]>
New Name <[email protected]> <[email protected]>

2. Выполнить фильтрацию:

python -m git_filter_repo --mailmap my-mailmap.txt --force

Важно!

  • После переписывания истории используйте только git push --force.

  • Все, кто работал с этим репозиторием, должны сделать новый клон или жёсткий reset.

  • Рекомендуется всегда работать на свежем клоне, чтобы не потерять старые данные.