Как изменить имя автора и коммиттера и адрес электронной почты нескольких коммитов в Git?
Я писал простой сценарий на школьном компьютере и вносил изменения в Git (в репо, которое было в моем pendrive, клонированном с моего компьютера дома). После нескольких коммитов я понял, что я совершаю вещи как пользователь root.
есть ли способ изменить автора этих коммитов на мое имя?
30 ответов
изменение автора (или коммиттера) потребует переписывания всей истории. Если вы в порядке с этим и думаете, что это стоит того, то вы должны проверить git filter-branch. Man-страница содержит несколько примеров для начала работы. Также обратите внимание, что вы можете использовать переменные среды для изменения имени автора, коммиттера, дат и т. д. -- см. раздел" Переменные среды"git man page.
в частности, вы можете исправить все неправильные имена авторов и электронные письма для всех ветвей и тегов С помощью этой команды (источник: помощь 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>
затем отметьте все свои плохие коммиты как "редактировать" в файле rebase. Если вы также хотите изменить свою первую фиксацию, вы должны вручную добавить ее в качестве первой строки в файл rebase (следуйте формату других строк). Затем, когда 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
Single Commit
как отметили некоторые комментаторы, если вы просто хотите изменить самую последнюю фиксацию, команда rebase не нужна. Просто сделай!--23-->
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 pull, в вашей истории будет тонна коммитов слияния). Это очень часто может привести к совершенно другой истории (как повторяющиеся изменения могут быть "перебазированы"), и в худшем случае это может привести к 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
С linebreaks в строке (что возможно в 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>"
(извлечено из ответа asmeurer)
в случае, когда только верхние несколько коммитов имеют плохих авторов, вы можете сделать это все внутри git rebase -i
С помощью и --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
сохранить и выйти из редактора (для запуска).
это решение может быть длиннее, чем некоторые другие, но оно очень контролируемо-I точно знать, что совершает его удары.
спасибо @asmeurer за вдохновение.
Github имеет хорошее решение, что следующий скрипт:
#!/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 filter-branch:
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
когда вы принимаете unmerged commit от другого автора, есть простой способ справиться с этим.
git commit --amend --reset-author
это более подробная версия версии @Brian:
чтобы изменить автора и коммиттера, вы можете сделать это (с помощью linebreaks в строке, которая возможна в 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
вы можете получить одну из этих ошибок:
- временный каталог уже существует
- ссылки, которые начинаются с refs / original уже есть
(это означает, что другая ветвь фильтра была запущена ранее на репозиторий и исходная ссылка на ветку сохраняются в refs / original)
если вы хотите принудительно запустить несмотря на эти ошибки, добавьте --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 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
псевдоним:
change-commits = "!f() { VAR=; OLD=; NEW=; 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
надеюсь, что это полезно.
- run
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
это сохранит всю другую информацию о фиксации (включая даты).
The --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, удалите все исходные ссылки, подкрепленные 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 "^=" "$authors_file" |
sed "s/^.*=\(.*\) <.*>$//"
}
get_email () {
grep "^=" "$authors_file" |
sed "s/^.*=.* <\(.*\)>$//"
}
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 для опции all.
#!/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
byAmend
, затем заменить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 Для больше информация.
это имеет преимущество всех других решений здесь в том, что вам не нужно переписывать историю, что может вызвать проблемы, если у вас есть восходящий поток, и всегда хороший способ случайно потерять данные.
конечно, если вы совершили что-то как себя, и это действительно должен быть кто-то другой, и вы не возражаете переписать историю на данный момент, изменение автора фиксации, вероятно, является хорошей идеей для целей атрибуции (в этом случае я направляю вас к моему другой ответ здесь).
если вы единственный пользователь этого репозитория, вы можете переписать историю используя git filter-branch
(as svick писал), или git fast-export
/git fast-import
плюс скрипт фильтра (как описано в статье, на которую ссылается в docgnome ответ), или интерактивные rebase. Но любой из них изменит изменения с первого измененного фиксации; это означает неприятности для любого, кто основывал его / ее изменения в вашей ветке предварительно переписать.
восстановление
если другие разработчики не основывали свою работу на предварительной версии перезаписи, самым простым решением было бы повторно клонировать (снова клонировать).
в качестве альтернативы они могут попробовать git rebase --pull
, который бы перемотал вперед, если бы в их репозитории не было никаких изменений, или перебазировал свою ветвь поверх перезаписанных коммитов (мы хотим избежать слияния, так как это сохранит предварительные перезаписи навсегда). Все это предполагая, что они не имеют не comitted работы; используйте git stash
, чтобы спрятать изменения в противном случае.
если другие разработчики используют ветви функций и / или git pull --rebase
не работает, например, потому что upstream не настроен, они должны rebase их работа поверх коммитов post-rewrite. Например, сразу после получения новых изменений (git fetch
), на master
филиал на основе / раздвоенный от origin/master
нужно запустить
$ git rebase --onto origin/master origin/master@{1} master
здесь origin/master@{1}
состояние предварительной перезаписи (перед выборкой), см. gitrevisions.
альтернативным решением было бы использовать refs / replace/ механизм, доступный в Git с версии 1.6.5. В этом решении вы предоставляете замены для коммитов, которые имеют неправильную электронную почту; тогда любой, кто получает "replace" refs (что-то вроде 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
который не имеет (пока) пакетного режима, поэтому вам придется использовать Shell loop для или заменить "вручную".
НЕ ПРОВЕРЕНО! YMMV.
обратите внимание, что при использовании refs/replace/
механизм: он новый, и еще не очень хорошо протестированы.
Если коммиты, которые вы хотите исправить, являются последними, и только несколько из них, вы можете использовать комбинацию git reset
и git stash
чтобы вернуться к фиксации их снова после настройки правильного имени и электронной почты.
последовательность будет примерно такой (для 2 неправильных коммитов, без ожидающих изменений):
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" содержит изменения
- щелкните правой кнопкой мыши-заменить на-Branch - 'local_master_user_x'
- зафиксируйте эти изменения снова, на этот раз как правильный пользователь и в локальную ветку "master"
- нажмите на удаленный "мастер"
используя интерактивные перебазирования, вы можете разместить команды вносить изменения после каждого коммита, который вы хотите изменить. Например:
pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead
обратите внимание, что Git хранит два различные адреса электронной почты, один для committer (человек, который совершил изменение) и еще один для автор (человек, который написал смену).
информация коммиттер не отображается в большинстве мест, но вы можете увидеть его с 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 в имени автора вызывал проблемы на сервере сборки, поэтому нам пришлось переписать историю, чтобы исправить это. Были предприняты следующие шаги:--2-->
Шаг 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
-
изменение соответствия автора и коммиттера на и
. Пас -f
фильтровать-ветвь, чтобы разрешить перезапись резервных копий$ git changemail -b old@email.com -n newname -m new@email.com -- -f <branch> <branch2>
-
показать существующих пользователей на репо
$ git changemail --show-both
кстати, после внесения изменений очистите резервную копию из ветви фильтра с помощью: git-backup-clean
Если вы единственный пользователь этого РЕПО или вы не заботитесь о возможном нарушении РЕПО для других пользователей, то да. Если вы подтолкнули эти коммиты, и они существуют где-то еще, где они могут получить доступ к ним, то нет, если вы не заботитесь о нарушении РЕПО других людей. Проблема в том, что, изменяя эти коммиты, вы будете генерировать новые SHAs, которые заставят их рассматриваться как разные коммиты. Когда кто-то еще пытается вытащить эти измененные коммиты, история отличается и бум.
эта страница http://inputvalidation.blogspot.com/2008/08/how-to-change-git-commit-author.html описывает, как это сделать. (Я не пробовал это так YMMV)
Я тоже хочу добавить свой пример. Я хочу создать bash_function с заданным параметром.
это работает в mint-linux-17.3
# => email to change, => new_name, => 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 # после перебазирования делается (цикл будет постоянно обновлять последнего коммита)
попробуйте это. Он будет делать то же, что и выше, но в интерактивном режиме.
bash <(curl -s https://raw.githubusercontent.com/majdarbash/git-author-change-script/master/run.sh)
ссылка:https://github.com/majdarbash/git-author-change-script
Это не ответ на ваш вопрос, а сценарий вы можете использовать, чтобы избежать этого в будущем. Он использует глобальные крючки, доступные с git версии 2.9 чтобы проверить конфигурацию электронной почты на основе каталога ваш в:
#!/bin/sh
PWD=`pwd`
if [[ $PWD == *"Ippon"* ]] # 1)
then
EMAIL=$(git config user.email)
if [[ $EMAIL == *"Work"* ]] # 2)
then
echo "";
else
echo "Email not configured to your Work email in the Work directory.";
git config user.email "youremail@youremail.com"
echo "Git email configuration has now been changed to \"$(git config user$
echo "\nPlease run your command again..."
echo ''
exit 1
fi;
elif [[ $PWD == *"Personal"* ]]
then
EMAIL=$(git config user.email)
if [[ $EMAIL == "youremail@youremail.com" ]]
then
echo "";
else
echo "Email is not configured to your personal account in the Personal di$
git config user.email "youremail@youremail.com"
echo "Git email configuration has now been changed to \"$(git config user$
echo "\nPlease run your command again..."
echo ''
exit 1;
fi;
fi;
он проверяет ваш текущий рабочий каталог, а затем проверяет, что ваш git настроен на правильную электронную почту. Если нет, он меняет его автоматически. Смотрите полную информацию здесь.