Вопрос: Как изменить историю git для исправления неправильного адреса / имени электронной почты [закрыто]


Когда я начал использовать git, я просто сделал git init и начал звонить add а также commit, Теперь я начинаю обращать внимание, и я вижу, что мои коммиты появляются cowens@localmachine, а не адрес, который я хочу. Кажется, что настройка GIT_AUTHOR_EMAIL а также GIT_COMMITTER_EMAIL будет делать то, что я хочу, но у меня все еще есть те старые коммиты с неправильным адресом / именем электронной почты. Как я могу исправить старые коммиты?


71
2018-05-26 20:56


Источник


Для наших будущих читателей: вопросы об использовании git для целей, подобных этому, лучше спросить о Переполнение стека, - Michael Hampton♦
Вот ближайший вопрос на stackoverflow.com. - naught101


Ответы:


Вы можете вернуться и исправить все свои коммиты с помощью одного вызова git filter-branch. Это имеет тот же эффект, что и rebase, но вам нужно только сделать одну команду, чтобы исправить всю вашу историю, вместо того, чтобы фиксировать каждую фиксацию отдельно.

Вы можете исправить все неправильные письма этой командой:

git filter-branch --env-filter '
    oldname="(old name)"
    oldemail="(old email)"
    newname="(new name)"
    newemail="(new email)"
    [ "$GIT_AUTHOR_EMAIL"="$oldemail" ] && GIT_AUTHOR_EMAIL="$newemail"
    [ "$GIT_COMMITTER_EMAIL"="$oldemail" ] && GIT_COMMITTER_EMAIL="$newemail"
    [ "$GIT_AUTHOR_NAME"="$oldname" ] && GIT_AUTHOR_NAME="$newname"
    [ "$GIT_COMMITTER_NAME"="$oldname" ] && GIT_COMMITTER_NAME="$newname"
    ' HEAD

Более подробную информацию можно получить в git docs


79
2018-05-27 17:51



ну, git filter-branch --env-filter 'export GIT_AUTHOR_EMAIL = "foo@example.com"; GIT_AUTHOR_NAME = "Foo" намного проще, спасибо. Это был бы принятый ответ, если бы я мог его изменить (похоже, что есть ошибка с Server Fault). - Chas. Owens
Обратите внимание, что на экспортных линиях не должно быть пробелов по обе стороны от знака равенства. То есть они должны выглядеть так: export GIT_AUTHOR_EMAIL = "(правильный адрес электронной почты)"; - Andy Balaam
Теперь, как я буду делать это в Windows? - CarstenSchmitz
@Deckard: сохраните скрипт в текстовом файле, таком как fixcommits.sh, затем запустите Git Bash и запустите скрипт. Я поместил файл сценария в корень моего репо, затем перешел к этой папке в Git Bash, затем я запустил скрипт с ./fixcommits.sh - Avalanchis
Добавление 1 Этот формат команды не работал для меня, но если / затем сделал: if [ "$GIT_AUTHOR_EMAIL" = "$oldemail" ]; then GIT_AUTHOR_EMAIL="$newemail"; fi - Josh M.


Команда Git's filter-branch является мощной, но она ужасно громоздка для использования для чего-то нетривиального, например, если у вас есть несколько авторов для исправления.

Вот альтернатива, которую я нашел полезной, которая использует функцию .mailmap, описанную в man-странице git-shortlog. Это обеспечивает механизм сопоставления авторов, который мы можем использовать с помощью средства форматирования git log. Мы можем использовать его для генерации команд для выбора и изменения поправок по именованной последовательности коммитов.

Например, предположим, что вы хотите исправить авторство в ветке $ BRANCH, начиная с фиксации $ START.

Вам нужно создать файл .mailmap в верхней папке вашего репозитория, который сопоставляет имена существующих авторов с правильными. Вы можете получить список существующих имен авторов с помощью:

git shortlog -se

Вам нужно в конечном итоге создать файл .mailmap, как это (скажем):

You <you@somewhere.org>   cowens@localmachine
You <you@somewhere.org>   root@localmachine

Теперь вы можете использовать функцию форматирования git log для генерации команд для переписывания $ BRANCH в качестве $ BRANCH2.

git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh - 

Первая команда создает новую пустую ветвь, прорастающую из commit $ START. Для каждой фиксации между $ START и последующим окончанием $ BRANCH вторая команда cherry выбирает исходную фиксацию в конец текущей ветви $ BRANCH2 и исправляет ее, чтобы правильно установить автора.

Это также общеприменимо - поместите это в свой файл ~ / .gitconfig:

[alias]
    # git reauthor $START..$END
    reauthor = !sh -c 'eval `git log --reverse --topo-order --pretty=format:\"git cherry-pick %H &&  git commit --amend -C %H --author=\\\"%aN <%aE>\\\" && \" $0 ` "echo success" '

Поэтому, когда вам нужно исправить авторов, теперь вам просто нужно создать файл .map и сделать:

git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH

Исходная ссылка ref ref может быть переназначена на новую, а новая удалена:

git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2

27
2017-07-29 10:54



Это круто. Я бы набрал тебя, если бы у меня было больше репутации. Благодаря :) - pistache


Сочетание ответа Как исправить метаинформацию при первом коммитах в git?

### Fix the first commit ###    
# create a temporary tag for the root-most commit so we can reference it
git tag root `git rev-list HEAD | tail -1`
# check it out on its own temporary branch
git checkout -b new-root root
# amend the commit
git commit --amend --author "Foo foo@example.com"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# now you've changed the commit message, so checkout the original branch again
git checkout @{-1}
# and rebase it onto your new root commit
git rebase --onto new-root root
### Fix the rest of the commits ###
git rebase -i root
# edit the file to read "edit <commit number> for each entry
# amend the commit
git commit --amend --author "Foo foo@example.com"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# move to the next commit
git rebase --continue    
# continue running the last two commands until you see
# Successfully rebased and updated refs/heads/master.
### Clean up ###
# nuke the temporary branch we created
git branch -d new-root
# nuke the temporary tag we created
git tag -d root

8
2018-05-27 16:45



Получил меня на правильном пути, но мне нужна команда: stackoverflow.com/a/28536828/307 вместо использования --author - Brett Veenstra


Чтобы следовать ответу Джедберга: вы можете использовать rebase -i и выберите для редактирования коммиты, о которых идет речь. Если вы используете git commit --amend --author <AUTHOR DETAILS> а потом git rebase continue вы можете пройти и исправить историю.


4
2018-05-26 22:02