Як редагувати історію git, щоб виправити неправильну адресу / ім’я електронної пошти [закрито]


76

Коли я почав використовувати git, я просто зробив git initі почав телефонувати addі commit. Тепер я починаю звертати увагу, і я бачу, що мої комісії відображаються як cowens@localmachine, а не адреса, яку я хочу. Схоже, що налаштування GIT_AUTHOR_EMAILі GIT_COMMITTER_EMAILбуде робити те, що я хочу, але я все ще маю ті старі зобов’язання з неправильною електронною адресою / ім'ям. Як я можу виправити старі коміти?


4
Для наших майбутніх читачів: Питання щодо використання gitдля подібних цілей краще задавати на Stack Overflow .
Майкл Хемптон

Ось найближче запитання на сайті stackoverflow.com.
naught101

Відповіді:


82

Ви можете повернутися та виправити всі свої зобов’язання одним викликом, щоб отримати git filter-branch. Це має такий же ефект, як і ребазація, але вам потрібно виконати лише одну команду, щоб виправити всю свою історію, а не фіксувати кожну комісію окремо.

Ви можете виправити всі неправильні електронні листи за допомогою цієї команди:

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


11
ну, git filter-branch --env-filter 'export GIT_AUTHOR_EMAIL = "foo@example.com"; GIT_AUTHOR_NAME = "Foo" "набагато простіше, дякую. Це була б прийнята відповідь, якби я міг її змінити (схоже, є помилка з помилкою сервера).
Час. Оуенс

7
Зверніть увагу, що на експортних лініях НЕ повинно бути пробілів по обидва боки від знака рівності. Тобто вони повинні виглядати приблизно так: export GIT_AUTHOR_EMAIL = "(правильна електронна адреса)";
Енді Валаам

1
Тепер, як би це зробити в Windows?
Карстен Шмітц

2
@Deckard: збережіть скрипт у текстовому файлі, такому як fixcommiss.sh, після чого запустіть Git Bash та запустіть сценарій. Я помістив файл сценарію в корінь мого репо, потім перейшов до цієї папки в Git Bash, потім запустив сценарій з ./fixcommits.sh
Avalanchis

2
Додаток 1 Цей командний формат не працював для мене, але якщо / тоді зробив:if [ "$GIT_AUTHOR_EMAIL" = "$oldemail" ]; then GIT_AUTHOR_EMAIL="$newemail"; fi
Джош М.

28

Команда гілки фільтру-гілки є потужною, але її жахливо непросто використовувати для чогось нетривіального, як, наприклад, якщо у вас є кілька авторів для виправлення.

Ось альтернатива, яку я знайшов корисною, яка використовує функцію .mailmap, описану на сторінці git-shortlog. Це забезпечує механізм авторського відображення, який ми можемо використовувати з засобом форматування журналу git. Ми можемо використовувати його для генерування команд для вибору та внесення змін до іменованої послідовності комітів.

Наприклад, припустимо, ви хочете виправити авторство на гілці $ BRANCH, починаючи з комісії $ START.

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

git shortlog -se

Вам потрібно створити такий файл .mailmap (скажімо):

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

Тепер ви можете використовувати функцію форматування журналу git для створення команд, щоб переписати $ 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 - 

Перша команда створює нову порожню гілку, що проростає з комітки $ 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" '

Отже, коли вам потрібно виправити авторів, тепер вам просто потрібно створити .mapfile і зробити:

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

Оригінальний номер відгалуження може бути переписаний на новий, а новий видалений:

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

Це круто. Я б з тобою шанував, якби у мене було більше представників. Дякую :)
фісташка

9

Поєднання відповіді з " Як я можу виправити метеоінформацію на першому фіксації в 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

Потрапив на правильний шлях, але потрібна команда від: stackoverflow.com/a/28536828/307 замість використання --author
Brett Veenstra

5

Щоб відповісти на відповідь jedberg: Ви можете використовувати rebase -iта редагувати питання, про які йдеться. Якщо ви користуєтеся, git commit --amend --author <AUTHOR DETAILS>то git rebase continueможете пройти і виправити історію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.