Как изменить имя автора и коммиттера, а также адрес электронной почты нескольких коммитов в Git?
-
09-09-2019 - |
Вопрос
Я писал простой сценарий на школьном компьютере и фиксировал изменения в Git (в репозитории, который был на моей флешке и клонирован с моего домашнего компьютера).После нескольких коммитов я понял, что делаю коммит от имени пользователя root.
Есть ли способ изменить автора этих коммитов на мое имя?
Решение
Изменение автора (или коммиттера) потребует переписывания всей истории.Если вас это устраивает и вы думаете, что оно того стоит, вам стоит попробовать. git-ветвь фильтра.Страница руководства содержит несколько примеров, которые помогут вам начать работу.Также обратите внимание, что вы можете использовать переменные среды для изменения имени автора, коммиттера, дат и т. д.-- см. раздел «Переменные среды» документа справочная страница git.
В частности, вы можете исправить все неправильные имена и адреса электронной почты авторов. для всех веток и тегов с помощью этой команды (источник: Справка GitHub):
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
Другие советы
Использование интерактивной перебазировки
Ты мог бы сделать
git rebase -i -p <some HEAD before all of your bad commits>
Затем отметьте все свои плохие коммиты как «редактируемые» в файле перебазирования.Если вы также хотите изменить свой первый коммит, вам придется вручную добавить его в качестве первой строки в файле перебазирования (следуйте формату остальных строк).Затем, когда git попросит вас изменить каждый коммит, выполните
git commit --amend --author "New Author Name <email@address.com>"
отредактируйте или просто закройте открывшийся редактор, а затем выполните
git rebase --continue
чтобы продолжить перебазирование.
Вы можете вообще не открывать редактор, добавив --no-edit
так что команда будет:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Одиночная фиксация
Как заметили некоторые комментаторы, если вы просто хотите изменить самый последний коммит, команда rebase не требуется.Просто делать
git commit --amend --author "New Author Name <email@address.com>"
Это изменит имя автора на указанное имя, но коммиттером будет назначен настроенный вами пользователь в git config user.name
и git config user.email
.Если вы хотите установить в качестве коммиттера то, что вы укажете, это установит и автора, и коммиттера:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
Примечание о коммитах слияния
В моем первоначальном ответе была небольшая ошибка.Если есть какие-либо коммиты слияния между текущими HEAD
и ваш <some HEAD before all your bad commits>
, затем git rebase
сгладит их (и, кстати, если вы используете запросы на извлечение GitHub, в вашей истории будет масса коммитов слияния).Очень часто это может привести к совсем другой истории (поскольку повторяющиеся изменения могут быть «перебазированы»), а в худшем случае это может привести к git rebase
с просьбой разрешить сложные конфликты слияния (которые, вероятно, уже были разрешены в коммитах слияния).Решение состоит в том, чтобы использовать -p
пометить git rebase
, который сохранит структуру слияния вашей истории.Страница руководства для git rebase
предупреждает, что использование -p
и -i
может привести к проблемам, но в BUGS
В разделе говорится: «Редактирование коммитов и изменение формулировок их сообщений о коммитах должно работать нормально».
я добавил -p
к вышеуказанной команде.В случае, когда вы просто меняете самый последний коммит, это не проблема.
Вы также можете сделать:
git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
then
GIT_COMMITTER_NAME="<New Name>";
GIT_AUTHOR_NAME="<New Name>";
GIT_COMMITTER_EMAIL="<New Email>";
GIT_AUTHOR_EMAIL="<New Email>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
Обратите внимание: если вы используете эту команду в командной строке Windows, вам необходимо использовать "
вместо '
:
git filter-branch --commit-filter "
if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
then
GIT_COMMITTER_NAME="<New Name>";
GIT_AUTHOR_NAME="<New Name>";
GIT_COMMITTER_EMAIL="<New Email>";
GIT_AUTHOR_EMAIL="<New Email>";
git commit-tree "$@";
else
git commit-tree "$@";
fi" HEAD
Один вкладыш, но будьте осторожны, если у вас многопользовательский репозиторий — это изменится. все обязуется иметь одного и того же (нового) автора и коммиттера.
git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD
С переносами строк в строке (что возможно в bash):
git filter-branch -f --env-filter "
GIT_AUTHOR_NAME='Newname'
GIT_AUTHOR_EMAIL='new@email'
GIT_COMMITTER_NAME='Newname'
GIT_COMMITTER_EMAIL='new@email'
" HEAD
Это происходит, когда у вас не инициализирован $HOME/.gitconfig.Вы можете исправить это как:
git config --global user.name "you name"
git config --global user.email you@domain.com
git commit --amend --reset-author
протестировано с версией git 1.7.5.4
Для одного коммита:
git commit --amend --author="Author Name <email@address.com>"
(извлечено из ответа Асмерера)
В случае, когда плохие авторы есть только у нескольких верхних коммитов, вы можете сделать все это внутри git rebase -i
используя exec
команда и --amend
зафиксируйте следующим образом:
git rebase -i HEAD~6 # as required
который представляет вам редактируемый список коммитов:
pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2
Затем добавьте exec ... --author="..."
строки после всех строк с плохими авторами:
pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
сохраните и выйдите из редактора (для запуска).
Это решение, возможно, требует больше времени для ввода, чем некоторые другие, но оно легко управляемо — я точно знаю, какие коммиты оно затрагивает.
Спасибо @asmeurer за вдохновение.
На Гитхабе есть хорошее решение, который представляет собой следующий сценарий оболочки:
#!/bin/sh
git filter-branch --env-filter '
an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"
if [ "$GIT_COMMITTER_EMAIL" = "your@email.to.match" ]
then
cn="Your New Committer Name"
cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match" ]
then
an="Your New Author Name"
am="Your New Author Email"
fi
export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'
Как упоминал docgnome, переписывание истории опасно и приведет к поломке чужих репозиториев.
Но если вы действительно хотите это сделать и находитесь в среде bash (в Linux нет проблем, в Windows вы можете использовать git bash, который предоставляется при установке git), используйте git-ветвь фильтра:
git filter-branch --env-filter '
if [ $GIT_AUTHOR_EMAIL = bad@email ];
then GIT_AUTHOR_EMAIL=correct@email;
fi;
export GIT_AUTHOR_EMAIL'
Чтобы ускорить процесс, вы можете указать диапазон ревизий, которые хотите переписать:
git filter-branch --env-filter '
if [ $GIT_AUTHOR_EMAIL = bad@email ];
then GIT_AUTHOR_EMAIL=correct@email;
fi;
export GIT_AUTHOR_EMAIL' HEAD~20..HEAD
При принятии неслитого коммита от другого автора есть простой способ справиться с этим.
git commit --amend --reset-author
Вы можете использовать это как псевдоним поэтому вы можете сделать:
git change-commits GIT_AUTHOR_NAME "old name" "new name"
или для последних 10 коммитов:
git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD
Добавьте в ~/.gitconfig:
[alias]
change-commits = "!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$`echo $VAR`\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" $@; }; f "
Источник: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
Надеюсь, это полезно.
Это более сложная версия версии @Brian:
Чтобы изменить автора и коммиттера, вы можете сделать это (с переносами строк в строке, что возможно в bash):
git filter-branch --env-filter '
if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
then
GIT_COMMITTER_NAME="<New name>";
GIT_COMMITTER_EMAIL="<New email>";
GIT_AUTHOR_NAME="<New name>";
GIT_AUTHOR_EMAIL="<New email>";
fi' -- --all
Вы можете получить одну из этих ошибок:
- Временный каталог уже существует
- Ссылки, начинающиеся с ссылки/оригинал уже существует
(это означает, что в репозитории ранее была запущена другая ветвь фильтра, а ссылка на исходную ветку резервируется по адресу ссылки/оригинал)
Если вы хотите принудительно выполнить запуск, несмотря на эти ошибки, добавьте --force
флаг:
git filter-branch --force --env-filter '
if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
then
GIT_COMMITTER_NAME="<New name>";
GIT_COMMITTER_EMAIL="<New email>";
GIT_AUTHOR_NAME="<New name>";
GIT_AUTHOR_EMAIL="<New email>";
fi' -- --all
Небольшое пояснение к -- --all
может понадобиться опция:Это заставляет ветку фильтра работать со всеми ревизиями на все ссылки (включая все филиалы).Это означает, например, что теги также перезаписываются и видны на переписанных ветках.
Распространенной «ошибкой» является использование HEAD
вместо этого это означает фильтрацию всех редакций только по текущая ветка.И тогда в переписанной ветке не будет тегов (или других ссылок).
- бегать
git rebase -i <sha1 or ref of starting point>
- отметьте все коммиты, которые вы хотите изменить, с помощью
edit
(илиe
) зацикливайте следующие две команды, пока не обработаете все коммиты:
git commit --amend --reuse-message=HEAD --author="New Author <new@author.email>"
;git rebase --continue
Это сохранит всю остальную информацию о фиксации (включая даты).А --reuse-message=HEAD
опция предотвращает запуск редактора сообщений.
Я использую следующее, чтобы переписать автора для всего репозитория, включая теги и все ветки:
git filter-branch --tag-name-filter cat --env-filter "
export GIT_AUTHOR_NAME='New name';
export GIT_AUTHOR_EMAIL='New email'
" -- --all
Затем, как описано в MAN-страница ветки фильтра, удалите все оригинальные ссылки, подкрепленные filter-branch
(это разрушительно, сначала сделайте резервную копию):
git for-each-ref --format="%(refname)" refs/original/ | \
xargs -n 1 git update-ref -d
я адаптировал это решение который работает путем приема простого author-conv-file
(формат такой же, как и для git-cvsimport).Он работает путем изменения всех пользователей, как определено в author-conv-file
по всем филиалам.
Мы использовали это вместе с cvs2git
перенести наш репозиторий с cvs на git.
то естьОбразец author-conv-file
john=John Doe <john.doe@hotmail.com>
jill=Jill Doe <jill.doe@hotmail.com>
Сценарий:
#!/bin/bash
export $authors_file=author-conv-file
git filter-branch -f --env-filter '
get_name () {
grep "^$1=" "$authors_file" |
sed "s/^.*=\(.*\) <.*>$/\1/"
}
get_email () {
grep "^$1=" "$authors_file" |
sed "s/^.*=.* <\(.*\)>$/\1/"
}
GIT_AUTHOR_NAME=$(get_name $GIT_COMMITTER_NAME) &&
GIT_AUTHOR_EMAIL=$(get_email $GIT_COMMITTER_NAME) &&
GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME &&
GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL &&
export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
' -- --all
Представленные версии мне показались слишком агрессивными, особенно если вы фиксируете патчи от других разработчиков, это по сути украдет их код.
Версия ниже работает во всех ветках и меняет автора и автора отдельно, чтобы предотвратить это.
Спасибо leif81 за все варианты.
#!/bin/bash
git filter-branch --env-filter '
if [ "$GIT_AUTHOR_NAME" = "<old author>" ];
then
GIT_AUTHOR_NAME="<new author>";
GIT_AUTHOR_EMAIL="<youmail@somehost.ext>";
fi
if [ "$GIT_COMMITTER_NAME" = "<old committer>" ];
then
GIT_COMMITTER_NAME="<new commiter>";
GIT_COMMITTER_EMAIL="<youmail@somehost.ext>";
fi
' -- --all
Изменить фиксацию
author name & email
кAmend
, затем заменивold-commit with new-one
:$ git checkout <commit-hash> # checkout to the commit need to modify $ git commit --amend --author "name <author@email.com>" # change the author name and email $ git replace <old-commit-hash> <new-commit-hash> # replace the old commit by new one $ git filter-branch -- --all # rewrite all futures commits based on the replacement $ git replace -d <old-commit-hash> # remove the replacement for cleanliness $ git push -f origin HEAD # force push
Другой путь
Rebasing
:$ git rebase -i <good-commit-hash> # back to last good commit # Editor would open, replace 'pick' with 'edit' before the commit want to change author $ git commit --amend --author="author name <author@email.com>" # change the author name & email # Save changes and exit the editor $ git rebase --continue # finish the rebase
Должен отметить, что если единственная проблема заключается в том, что автор/адрес электронной почты отличается от вашего обычного, это не проблема.Правильное решение — создать файл с именем .mailmap
в основании каталога такими строками, как
Name you want <email you want> Name you don't want <email you don't want>
И с этого момента такие команды, как git shortlog
будут считать эти два имени одинаковыми (если вы специально не скажете им этого не делать).Видеть http://schacon.github.com/git/git-shortlog.html Чтобы получить больше информации.
Это имеет преимущество перед всеми другими решениями здесь в том, что вам не нужно перезаписывать историю, что может вызвать проблемы, если у вас есть восходящий поток, и это всегда хороший способ случайно потерять данные.
Конечно, если вы зафиксировали что-то от себя, и это действительно должен быть кто-то другой, и вы не против переписать историю на этом этапе, изменение автора коммита, вероятно, будет хорошей идеей для целей атрибуции (в этом случае я направляю вас к моему другой ответ здесь).
А одна команда чтобы изменить автора последних N коммитов:
git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"
ПРИМЕЧАНИЯ
- тот
--no-edit
флаг гарантирует, чтоgit commit --amend
не требует дополнительного подтверждения - когда ты используешь
git rebase -i
, можно вручную выбрать коммиты, где изменить автора,
файл, который вы редактируете, будет выглядеть так:
pick 897fe9e simplify code a little
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
Затем вы все равно можете изменить некоторые строки, чтобы увидеть, где вы хотите изменить автора.Это дает вам хорошую золотую середину между автоматизацией и контролем:вы видите шаги, которые будут выполняться, и как только вы сохраните, все будет применено сразу.
Если вы единственный пользователь этого репозитория, вы можете переписать историю используя либо git filter-branch
(как Свик написал), или git fast-export
/git fast-import
плюс сценарий фильтра (как описано в статье, указанной в ответ докгнома), или интерактивный перебазировать.Но любой из них изменит версии, начиная с первого измененного коммита;это означает проблемы для всех, кто основывал свои изменения на предварительной переписывании вашей ветки.
ВОССТАНОВЛЕНИЕ
Если бы другие разработчики не основывали свою работу на предварительно переписанной версии, самым простым решением было бы повторное клонирование (снова клонирование).
Альтернативно они могут попробовать git rebase --pull
, которые бы перемотали вперед, если бы в их репозитории не было никаких изменений, или перебазировали бы свою ветку поверх переписанных коммитов (мы хотим избежать слияния, так как в этом случае предперезаписанные коммиты будут сохраняться навсегда).Все это при условии, что они не совершили несовершенной работы;использовать git stash
в противном случае спрятать изменения.
Если другие разработчики используют ветки функций и/или git pull --rebase
не работает, напримерпоскольку восходящий поток не настроен, им приходится перебазировать их работа поверх коммитов после перезаписи.Например, сразу после получения новых изменений (git fetch
), для master
ветка, основанная на/развитая от origin/master
, нужно бежать
$ git rebase --onto origin/master origin/master@{1} master
Здесь origin/master@{1}
это состояние перед перезаписью (перед выборкой), см. gitrevisions.
Альтернативным решением было бы использовать ссылки/заменить/ механизм, доступный в Git начиная с версии 1.6.5.В этом решении вы предоставляете замену коммитам с неправильным адресом электронной почты;затем любой, кто получает ссылки на замену (что-то вроде fetch = +refs/replace/*:refs/replace/*
refspec в соответствующем месте в их .git/config
) получит замену прозрачно, а те, кто не получит эти ссылки, увидят старые коммиты.
Процедура выглядит примерно так:
Найдите все коммиты с неправильным адресом электронной почты, например, с помощью
$ git log --author=user@wrong.email --all
Для каждого неправильного коммита создайте заменяющий коммит и добавьте его в базу данных объектов.
$ git cat-file -p <ID of wrong commit> | sed -e 's/user@wrong\.email/user@example.com/g' > tmp.txt $ git hash-object -t commit -w tmp.txt <ID of corrected commit>
Теперь, когда вы исправили фиксацию в базе данных объектов, вы должны указать git автоматически и прозрачно заменить неправильную фиксацию исправленной, используя
git replace
команда:$ git replace <ID of wrong commit> <ID of corrected commit>
Наконец, перечислите все замены, чтобы проверить, прошла ли эта процедура успешно.
$ git replace -l
и проверьте, происходят ли замены
$ git log --author=user@wrong.email --all
Конечно, можно автоматизировать эту процедуру...ну, все, кроме использования git replace
в котором (пока) нет пакетного режима, поэтому для этого вам придется использовать цикл оболочки или заменить «вручную».
НЕ ИСПЫТАНО! ЮММВ.
Обратите внимание, что при использовании вы можете столкнуться с некоторыми неровными углами. refs/replace/
механизм:это новое и еще не очень хорошо проверенное.
Самый быстрый и простой способ сделать это — использовать аргумент --exec git rebase:
git rebase -i -p --exec 'git commit --amend --reset-author --no-edit'
Это создаст список дел, который выглядит следующим образом:
pick ef11092 Blah blah blah
exec git commit --amend --reset-author --no-edit
pick 52d6391 Blah bloh bloo
exec git commit --amend --reset-author --no-edit
pick 30ebbfe Blah bluh bleh
exec git commit --amend --reset-author --no-edit
...
и все это будет работать автоматически, что работает, когда у вас сотни коммитов.
Если коммиты, которые вы хотите исправить, являются последними и их всего пара, вы можете использовать комбинацию git reset
и git stash
чтобы вернуться и зафиксировать их снова после настройки правильного имени и адреса электронной почты.
Последовательность будет примерно такой (для двух неправильных коммитов нет ожидающих изменений):
git config user.name <good name>
git config user.email <good email>
git reset HEAD^
git stash
git reset HEAD^
git commit -a
git stash pop
git commit -a
Если вы используете Eclipse с EGit, есть довольно простое решение.
Предположение:у вас есть коммиты в локальной ветке «local_master_user_x», которые нельзя перенести в удаленную ветку «master» из-за недопустимого пользователя.
- Оформить заказ на удаленную ветку «master»
- Выберите проекты/папки/файлы, для которых «local_master_user_x» содержит изменения.
- Щелкните правой кнопкой мыши — Заменить на — Ветка — «local_master_user_x».
- Зафиксируйте эти изменения еще раз, на этот раз от имени правильного пользователя и в локальной ветке «master».
- Отправьте на удаленный «главный»
Используя интерактивную перебазировку, вы можете поместить команду изменения после каждого коммита, который хотите изменить.Например:
pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead
Обратите внимание, что git хранит два разные адреса электронной почты, один для коммиттер (человек, совершивший изменение) и еще один для автор (человек, написавший изменение).
Информация о коммиттере не отображается в большинстве мест, но вы можете увидеть ее с помощью git log -1 --format=%cn,%ce
(или используйте show
вместо log
чтобы указать конкретный коммит).
Хотя изменить автора вашего последнего коммита так же просто, как git commit --amend --author "Author Name <email@example.com>"
, не существует однострочника или аргумента, позволяющего сделать то же самое с информацией о коммиттере.
Решение состоит в том, чтобы (временно или нет) изменить вашу информацию о пользователе, а затем изменить коммит, который обновит коммиттер до вашей текущей информации:
git config user.email my_other_email@example.com
git commit --amend
Сегодня мы столкнулись с проблемой, когда символ UTF8 в имени автора вызывал проблемы на сервере сборки, поэтому нам пришлось переписать историю, чтобы исправить это.Предпринятые шаги заключались в следующем:
Шаг 1:Измените свое имя пользователя в git для всех будущих коммитов, как указано здесь:https://help.github.com/articles/setting-your-username-in-git/
Шаг 2:Запустите следующий bash-скрипт:
#!/bin/sh
REPO_URL=ssh://path/to/your.git
REPO_DIR=rewrite.tmp
# Clone the repository
git clone ${REPO_URL} ${REPO_DIR}
# Change to the cloned repository
cd ${REPO_DIR}
# Checkout all the remote branches as local tracking branches
git branch --list -r origin/* | cut -c10- | xargs -n1 git checkout
# Rewrite the history, use a system that will preseve the eol (or lack of in commit messages) - preferably Linux not OSX
git filter-branch --env-filter '
OLD_EMAIL="me@something.com"
CORRECT_NAME="New Me"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
fi
' --tag-name-filter cat -- --branches --tags
# Force push the rewritten branches + tags to the remote
git push -f
# Remove all knowledge that we did something
rm -rf ${REPO_DIR}
# Tell your colleagues to `git pull --rebase` on all their local remote tracking branches
Краткая информация:Извлеките свой репозиторий во временный файл, извлеките все удаленные ветки, запустите сценарий, который перезапишет историю, принудительно загрузит новое состояние и попросите всех своих коллег выполнить перебазирование, чтобы получить изменения.
У нас были проблемы с запуском этой программы на OS X, потому что она каким-то образом испортила окончания строк в сообщениях о фиксации, поэтому нам пришлось впоследствии повторно запустить ее на машине с Linux.
Ваша проблема действительно распространена.Видеть "Использование Mailmap для исправления списка авторов в Git"
Для простоты я создал скрипт, упрощающий этот процесс: git-changemail
Поместив этот скрипт на свой путь, вы можете выполнить такие команды, как:
Изменить совпадения авторов в текущей ветке
$ git changemail -a old@email.com -n newname -m new@email.com
Измените сопоставления автора и коммиттера в <branch> и <branch2>.Проходить
-f
в ветку фильтра, чтобы разрешить перезапись резервных копий$ git changemail -b old@email.com -n newname -m new@email.com -- -f <branch> <branch2>
Показать существующих пользователей в репо
$ git changemail --show-both
Кстати, после внесения изменений очистите резервную копию ветки фильтра с помощью: git-backup-clean
Если вы единственный пользователь этого репозитория или вас не волнует возможность нарушения репозитория для других пользователей, тогда да.Если вы отправили эти коммиты и они существуют там, где к ним может получить доступ кто-то еще, то нет, если только вас не заботит взлом репозиториев других людей.Проблема в том, что, изменяя эти коммиты, вы будете генерировать новые SHA, что приведет к тому, что они будут рассматриваться как разные коммиты.Когда кто-то другой пытается получить эти измененные коммиты, история меняется и бах.
Эта страница http://inputvalidation.blogspot.com/2008/08/how-to-change-git-commit-author.html описывает, как это сделать.(Я не пробовал это, так что YMMV)
Я тоже хочу добавить свой пример.Я хочу создать bash_function с заданным параметром.
это работает в mint-linux-17.3
# $1 => email to change, $2 => new_name, $3 => new E-Mail
function git_change_user_config_for_commit {
# defaults
WRONG_EMAIL=${1:-"you_wrong_mail@hello.world"}
NEW_NAME=${2:-"your name"}
NEW_EMAIL=${3:-"new_mail@hello.world"}
git filter-branch -f --env-filter "
if [ \$GIT_COMMITTER_EMAIL = '$WRONG_EMAIL' ]; then
export GIT_COMMITTER_NAME='$NEW_NAME'
export GIT_COMMITTER_EMAIL='$NEW_EMAIL'
fi
if [ \$GIT_AUTHOR_EMAIL = '$WRONG_EMAIL' ]; then
export GIT_AUTHOR_NAME='$NEW_NAME'
export GIT_AUTHOR_EMAIL='$NEW_EMAIL'
fi
" --tag-name-filter cat -- --branches --tags;
}
git rebase -i YOUR_FIRTS_COMMIT_SHA^
while true; do git commit --amend --author="Name Surname <email@example.com>" --no-edit && git rebase --continue; done
Нажмите ^C # после завершения перебазирования (цикл будет продолжать обновлять последний коммит)