Как изменить имя автора и коммиттера и e-mail нескольких коммитов в Git?

Я писал простой скрипт в школьном компьютере и вносил изменения в Git (в репо, которое было в моем pendrive, клонированном с моего компьютера дома). После нескольких коммитов я понял, что делаю материал как пользователь root.

Есть ли способ изменить автора этих коммитов на мое имя?

30 Solutions collect form web for “Как изменить имя автора и коммиттера и e-mail нескольких коммитов в Git?”

Изменение автора (или коммиттера) потребует повторной записи всей истории. Если вы в порядке с этим и считаете, что это того стоит, тогда вы должны проверить git filter-branch . Страница руководства содержит несколько примеров, чтобы начать работу. Также обратите внимание, что вы можете использовать переменные среды для изменения имени автора, коммиттера, дат и т. Д. – см. Раздел «Переменные среды» на странице git man .

В частности, вы можете исправить все неправильные имена авторов и электронные письма для всех ветвей и тегов с помощью этой команды (источник: Справка 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  

Затем отметьте все ваши плохие коммиты как «edit» в файле rebase. Если вы также хотите изменить свой первый коммит, вам нужно вручную добавить его в первую строку в файле rebase (следуйте формату других строк). Затем, когда git просит вас внести изменения в каждую фиксацию, сделайте

  git commit --amend --author "New Author Name " 

отредактируйте или просто закройте редактор, который открывается, а затем выполните

 git rebase --continue 

для продолжения rebase.

Вы можете пропустить открытие редактора здесь, добавив --no-edit чтобы команда была:

 git commit --amend --author "New Author Name " --no-edit && \ git rebase --continue 

Одиночный коммит

Как заметили некоторые из комментаторов, если вы просто хотите изменить самую последнюю фиксацию, команда rebase не нужна. Просто делать

  git commit --amend --author "New Author Name " 

Это изменит автора на указанное имя, но git config user.name будет настроен на ваш настроенный пользователь в 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 и вашим есть какое-либо слияние, то git rebase будет сглаживать их (и, кстати, если вы будете использовать запросы GitHub pull, то будет тонна слияния совершает в вашей истории). Это может очень часто приводить к очень разной истории (поскольку повторяющиеся изменения могут быть «переустановлены»), и в худшем случае это может привести к git rebase просьбой разрешить сложные конфликты слияния (которые, скорее всего, были решены в транзакции слияния ). Решение – использовать флаг -p для git rebase , который сохранит структуру слияния вашей истории. В manpage для git rebase указано, что использование -p и -i может привести к проблемам, но в разделе BUGS говорится: «Редактирование коммитов и их переписывание сообщений фиксации должно работать нормально».

Я добавил -p к указанной команде. Для случая, когда вы просто меняете последнее сообщение, это не проблема.

Вы также можете сделать:

 git filter-branch --commit-filter ' if [ "$GIT_COMMITTER_NAME" = "" ]; then GIT_COMMITTER_NAME=""; GIT_AUTHOR_NAME=""; GIT_COMMITTER_EMAIL=""; GIT_AUTHOR_EMAIL=""; git commit-tree "$@"; else git commit-tree "$@"; fi' HEAD 

Обратите внимание: если вы используете эту команду в командной строке Windows, вам нужно использовать " вместо ' :

 git filter-branch --commit-filter " if [ "$GIT_COMMITTER_NAME" = "" ]; then GIT_COMMITTER_NAME=""; GIT_AUTHOR_NAME=""; GIT_COMMITTER_EMAIL=""; GIT_AUTHOR_EMAIL=""; git commit-tree "$@"; else git commit-tree "$@"; fi" HEAD 

Один лайнер, но будьте осторожны, если у вас многопользовательский repository – это изменит все фиксации на наличие того же (нового) автора и коммиттера.

 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 " 

(извлеченные из ответа от респондента)

В случае, если только некоторые из немногих коммитов имеют плохих авторов, вы можете сделать это все внутри git rebase -i используя команду exec и --amend commit, следующим образом:

 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 " -C HEAD pick 1234 my bad commit 2 exec git commit --amend --author="New Author Name " -C HEAD 

сохранить и выйти из редактора (для запуска).

Это решение может быть длиннее, чем некоторые другие, но оно очень контролируемо – я точно знаю, что он совершает.

Спасибо @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" ' 

Как упоминалось выше, переписывание истории опасно и разрушит чужие репозитории.

Но если вы действительно хотите это сделать, и вы находитесь в среде 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 

Когда вы берете на себя несвязанный коммит от другого автора, есть простой способ справиться с этим.

git commit --amend --reset-author

Это более продуманная версия версии Брайана:

Чтобы изменить автора и коммиттера, вы можете сделать это (с помощью строк в строке, которая возможна в bash):

 git filter-branch --env-filter ' if [ "$GIT_COMMITTER_NAME" = "" ]; then GIT_COMMITTER_NAME=""; GIT_COMMITTER_EMAIL=""; GIT_AUTHOR_NAME=""; GIT_AUTHOR_EMAIL=""; fi' -- --all 

Вы можете получить одну из этих ошибок:

  1. Временная директория уже существует
  2. Refs, начинающийся с refs / original уже существует
    (это означает, что еще одна ветвь фильтра была запущена ранее в репозитории, а затем исходная ссылка на рестайлинг была скопирована в refs / original )

Если вы хотите принудительно выполнить прогон, несмотря на эти ошибки, добавьте флаг --force :

 git filter-branch --force --env-filter ' if [ "$GIT_COMMITTER_NAME" = "" ]; then GIT_COMMITTER_NAME=""; GIT_COMMITTER_EMAIL=""; GIT_AUTHOR_NAME=""; GIT_AUTHOR_EMAIL=""; fi' -- --all 

Может понадобиться небольшое объяснение опции -- --all : она делает работу с фильтром на всех ревизиях на всех ссылках (включая все ветви). Это означает, например, что tags также переписываются и видны на перезаписанных ветвях.

Общей «ошибкой» является использование 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 

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

Надеюсь, это полезно.

  1. run git rebase -i
  2. отметьте все фиксации, которые вы хотите изменить, с помощью edit (или e )
  3. запустите следующие две команды, пока вы не обработаете все коммиты:

    git commit --amend --reuse-message=HEAD --author="New Author " ; git rebase --continue

Это сохранит всю другую информацию о фиксации (включая даты). Параметр --reuse-message=HEAD запрещает запуск редактора сообщений.

Я использую следующее, чтобы переписать автора для всего репозитория, включая tags и все ветви:

 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 , удалите все исходные refs, резервные копии которых 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 чтобы перенести наш repository с cvs на git.

т.е. Sample author-conv-file

 john=John Doe  jill=Jill Doe  

Сценарий:

  #!/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" = "" ]; then GIT_AUTHOR_NAME=""; GIT_AUTHOR_EMAIL=""; fi if [ "$GIT_COMMITTER_NAME" = "" ]; then GIT_COMMITTER_NAME=""; GIT_COMMITTER_EMAIL=""; fi ' -- --all 
  1. Измените author name & email автора Amend на Amend , а затем замените old-commit with new-one :

     $ git checkout  # checkout to the commit need to modify $ git commit --amend --author "name " # change the author name and email $ git replace   # replace the old commit by new one $ git filter-branch -- --all # rewrite all futures commits based on the replacement $ git replace -d  # remove the replacement for cleanliness $ git push -f origin HEAD # force push 
  2. Другой способ: Rebasing :

     $ git rebase -i  # 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 " # change the author name & email # Save changes and exit the editor $ git rebase --continue # finish the rebase 

Я должен указать, что если единственная проблема заключается в том, что автор / электронная почта отличается от вашего обычного, это не проблема. Правильное исправление заключается в создании файла с именем .mailmap в базе каталога с такими строками, как

 Name you want  Name you don't want  

И с этого момента команды, такие как git shortlog будут считать эти два имени одинаковыми (если вы специально не говорите им об этом). Дополнительную информацию см. В http://schacon.github.com/git/git-shortlog.html .

Это дает преимущество всем остальным решениям здесь в том, что вам не нужно переписывать историю, которая может вызвать проблемы, если у вас есть восходящий stream, и это всегда хороший способ случайно потерять данные.

Конечно, если вы совершили что-то как себя, и это действительно должно быть кем-то другим, и вы не возражаете переписывать историю на этом этапе, изменение автора фиксации, вероятно, является хорошей идеей для целей атрибуции (в этом случае я направляю вас к своему другой ответ здесь).

Если вы являетесь единственным пользователем этого репозитория, вы можете переписать историю, используя либо git filter-branch (как svick написал ), либо git fast-export / git fast-import plus filter script (как описано в статье, на которую ссылается ответ docgnome ) или интерактивная перебаза . Но любой из них изменил бы изменения с первого измененного обязательства; это означает трудность для любого, кто основывал свои изменения на своей ветке, предварительно переписывая.

ВОССТАНОВЛЕНИЕ

Если другие разработчики не основывали свою работу на пред-переписывающей версии, самым простым решением было бы повторное клонирование (повторное клонирование).

В качестве альтернативы они могут попробовать git rebase --pull , которые бы быстро git rebase --pull , если в их репозитории не было никаких изменений, или пересобирали свою ветку поверх переписанных коммитов (мы хотим избежать слияния, переписывать комиксы навсегда). Все это предполагает, что у них нет работы; используйте git stash чтобы отменить изменения в противном случае.

Если другие разработчики используют ветви функций и / или git pull --rebase не работают, например, потому что восходящий git pull --rebase не настроен, им приходится перестраивать свою работу поверх git pull --rebase после перезаписи. Например, сразу после получения новых изменений ( git fetch ) для master ветки, основанной на / forked from origin/master , нужно запустить

 $ git rebase --onto origin/master origin/master@{1} master 

Здесь origin/master@{1} – состояние предварительной перезаписи (до извлечения), см. Gitrevisions .


Альтернативным решением было бы использовать refs / replace / механизм, ansible в Git начиная с версии 1.6.5. В этом решении вы предоставляете замены для коммитов с неправильным адресом электронной почты; то любой, кто получает «replace» ref (что-то вроде fetch = +refs/replace/*:refs/replace/* refspec в соответствующем месте в их .git/config ), будет получать замены прозрачно, а те, кто не извлекает эти ссылки, см. старые коммиты.

Процедура выглядит примерно так:

  1. Найдите все коммиты с неправильным адресом электронной почты, например, используя

     $ git log --author=user@wrong.email --all 
  2. Для каждого неправильного коммита создайте замену фиксации и добавьте его в базу данных объектов

     $ git cat-file -p  | sed -e 's/user@wrong\.email/user@example.com/g' > tmp.txt $ git hash-object -t commit -w tmp.txt  
  3. Теперь, когда вы скорректировали фиксацию в базе данных объектов, вы должны сказать git, чтобы автоматически и прозрачно заменить неправильную фиксацию, скорректировав ее с помощью команды git replace :

     $ git replace   
  4. Наконец, перечислите всю замену, чтобы проверить, выполнена ли эта процедура

     $ git replace -l 

    и проверить, есть ли замены

     $ git log --author=user@wrong.email --all 

Вы можете, конечно, автоматизировать эту процедуру … ну, все, кроме использования git replace которая не имеет (пока) пакетного режима, поэтому вам придется использовать оболочку для этого или заменить «вручную».

НЕ ИСПЫТАНО! YMMV.

Обратите внимание, что при использовании refs/replace/ mechanism вы можете столкнуться с некоторыми грубыми углами: он новый и еще не очень хорошо протестирован .

Если фиксации, которые вы хотите исправить, являются последними, и всего лишь несколько из них, вы можете использовать комбинацию git reset git stash и git stash чтобы вернуться к фиксации их после настройки правильного имени и электронной почты.

Последовательность будет примерно такой (для 2 неправильных коммитов, без ожидающих изменений):

 git config user.name  git config user.email  git reset HEAD^ git stash git reset HEAD^ git commit -a git stash pop git commit -a 

Если вы используете Eclipse с EGit, то есть довольно простое решение.
Предположение: вы совершили ошибку в локальном ветви local_master_user_x, который не может быть перенесен на «ведущий» удаленной ветви из-за недопустимого пользователя.

  1. Оформить проверку удаленной ветви «master»
  2. Выберите проекты / папки / файлы, для которых «local_master_user_x» содержит изменения
  3. Щелкните правой кнопкой мыши – Заменить на – Ветвь – ‘local_master_user_x’
  4. Зафиксируйте эти изменения еще раз, на этот раз как правильный пользователь и в «master» локальной ветви,
  5. Push to remote ‘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 " , нет ни одного лайнера или аргумента, чтобы сделать то же самое с информацией об участниках.

Решение состоит в том, чтобы (временно или нет) изменить вашу пользовательскую информацию, а затем исправить фиксацию, которая обновит коммиттер к вашей текущей информации:

 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 

Краткий обзор. Оформить заказ в хранилище временного файла, проверить все удаленные ветви, запустить сценарий, который будет переписывать историю, сделать силовое нажатие нового состояния и сообщить всем своим коллегам, чтобы сделать drag and drop, чтобы получить изменения.

У нас были проблемы с запуском этого в OS X, потому что он каким-то образом перепутал концы строк в сообщениях фиксации, поэтому нам пришлось повторно запустить его на машине Linux после этого.

Ваша проблема очень распространена. См. « Использование рассылки для исправления списка авторов в 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

Если вы являетесь единственным пользователем этого репо, или вы не заботитесь о возможном нарушении репо для других пользователей, то да. Если вы подтолкнули эти коммиты, и они существуют там, где где-то еще можно получить к ним доступ, то нет, если только вы не заботитесь о нарушении репозиториев других людей. Проблема заключается в изменении этих коммитов, вы будете генерировать новые SHA, которые заставят их рассматривать как разные коммиты. Когда кто-то пытается втянуть эти измененные коммиты, история отличается и kaboom.

Эта страница 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 " --no-edit && git rebase --continue; done 

Press ^C # after the rebase is done (the loop will keep updating last commit)

Попробуйте это. It will do the same as above mentioned, but interactively.

 bash < (curl -s https://raw.githubusercontent.com/majdarbash/git-author-change-script/master/run.sh) 

Reference: https://github.com/majdarbash/git-author-change-script

This isn’t an answer to your question, but rather a script you can use to avoid this in the future. It utilizes global hooks available since Git version 2.9 to check your email configuration based on the directory your in:

 #!/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; 

It checks your current working directory, then verifies your git is configured to the correct email. If not, it changes it automatically. See the full details here .

Давайте будем гением компьютера.