Как да промените автора на дадена ангажираност за едно конкретно ангажиране?

Искам да променя автора на една конкретна ангажираност в историята. Това не е последният ангажимент.

Знам за този въпрос - как мога да променя автора на коммита в git?

Но мисля за нещо, в което идентифицирам ангажимент от хеш или кратък хеш.

1564
15 июня '10 в 7:00 2010-06-15 07:00 MicTech е настроен на 15 юни в 7:00 часа 2010-06-15 07:00
@ 9 отговора

Интерактивна rebase от точка по-рано в историята от git rebase -i <earliercommit> трябва да промените ( git rebase -i <earliercommit> ). В списъка с корекции, които са били преместени, променете текста от pick към edit до хеш на този, който искате да промените. След това, когато git ви подкани да промените фиксацията, използвайте следното:

 git commit --amend --author="Author Name <email@address.com>" 

Например, ако вашата ABCDE-f поема история с F HEAD , и искате да промените автора на C и D , тогава ще ...

  1. Посочете git rebase -i B ( ето пример за това, което ще видите след изпълнение на командата git rebase -i B )
    • ако трябва да редактирате A , използвайте git rebase -i --root
  2. променете линиите за C и D от pick to edit
  3. Веднага след като започва ребаза, той първо ще спре при C
  4. Трябва да направите git commit --amend --author="Author Name <email@address.com>"
  5. Тогава git rebase --continue
  6. Това отново ще спре при D
  7. След това отново трябва да git commit --amend --author="Author Name <email@address.com>"
  8. git rebase --continue
  9. Преместването ще бъде завършено.
  10. Използвайте git push -f да актуализирате източника си с актуализирани корекции.
2672
15 июня '10 в 7:31 2010-06-15 07:31 отговорът беше даден на Амбър 15 юни '10 в 7:31 2010-06-15 07:31

Приетият отговор на този въпрос е изненадващо умното използване на интерактивното преместване, но за съжаление причинява конфликти, ако авторът, който се опитваме да променим, се използва от автора за клона, който по-късно се е слял. В по-общия случай това не работи, когато се обработват мръсни истории.

Тъй като се страхувам да стартирам скриптове, които зависят от настройка и нулиране на променливи на обкръжението, за да презапиша историята на git, пиша нов отговор на базата на този пост, който е подобен на този отговор, но е по-пълен.

Следното е тествано и работи, за разлика от съответния отговор. Да предположим за яснота, че 03f482d6 е 03f482d6 , авторът на който се опитваме да заменим, а 42627abe е ангажимент с нов автор.

border=0
  1. Направете ангажимент, който се опитваме да променим.

     git checkout 03f482d6 
  2. Направете промяна на автора.

     git commit --amend --author "New Author Name <New Author Email>" 

    Сега имаме нов ангажимент с хеш, равен на 42627abe .

  3. Проверете оригиналния клон.

  4. Заменете стария ангажимент с нов локално.

     git replace 03f482d6 42627abe 
  5. Препишете всички бъдещи корекции въз основа на подмяната.

     git filter-branch -- --all 
  6. Отстранете подмяната за чистота.

     git replace -d 03f482d6 
  7. Кликнете върху новата история (използвайте само --force, ако следното се провали и само след като тествате функционалността с git log и / или git diff ).

     git push --force-with-lease 

Вместо 4-6, можете просто да преминете към новия ангажимент:

 git rebase -i 42627abe 
369
04 марта '15 в 5:11 2015-03-04 05:11 отговорът е даден merlin2011 март 04 '15 в 5:11 2015-03-04 05:11
09 июня '15 в 19:02 2015-06-09 19:02 Отговорът е даден от olivieradam666 юни 09 '15 в 19:02 2015-06-09 19:02
  • Възстановете имейл адреса си в конфигурацията:

    git config --global user.email example@email.com

  • Сега рестартирайте автора на коммита, без да го редактирате:

    git commit --amend --reset-author --no-edit

82
05 апр. отговорът е даден на 05 април 2017-04-05 15:44 '17 в 15:44 часа 2017-04-05 15:44

Можете да промените автора на последния коммит, като използвате командата по-долу.

git commit --amend --author="Author Name <email@address.com>"

Въпреки това, ако искате да промените повече от едно име на автора, това е малко трудно. Трябва да започнете интерактивно преинсталиране, след което маркирайте коректно, след това ги променете един по един и завършете.

Започнете рестартирането с git rebase -i . Той ще ви покаже нещо подобно.

Променете ключовата дума за pick да я edit за коммитите, които искате да промените името на автора.

След това затворете редактора. За начинаещи натиснете Escape , след това напишете :wq и натиснете Enter .

Тогава ще видите вашия терминал, сякаш нищо не се е случило. Всъщност вие сте в средата на интерактивна пермутация. Сега е време да промените името на автора си, като използвате командата по-горе. Той отново ще отвори редактора. Затворете и продължете рестартирането с git rebase --continue . Повторете същото за размера на корекцията, която искате да редактирате. Можете ли да се уверите, че интерактивното обобщение завършва, когато сте получили съобщението No rebase in progress? ,

69
29 авг. отговорът е даден от Fatih 29 август. 2015-08-29 03:52 '15 в 3:52 2015-08-29 03:52

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

Като претекст за проучване на git filter-branch написах скрипт за пренаписване на името на автора и / или имейла на автора за този ангажимент:

15 июня '10 в 8:24 2010-06-15 08:24 Отговор, даден от Крис Джонсен на 15 юни '10 в 8:24 2010-06-15 08:24

Когато се изпълнява git rebase -i в документа се намира този интересен бит:

Ако искате да възстановите две или повече корекции в една, заменете командата "pick" с второ и следващо фиксиране с "squash" или "fixup" . Ако комитетите са имали различни автори, сгънатият фиксатор ще бъде приписан на автора на първия ангажимент. Предложеното съобщение за обвързване за сгънато фиксиране е конкатенация на съобщенията за предаване на първия коммит и командите с командата за "squash" , но пропуска съобщението за "fixup" на "fixup" .

  • Ако имате история ABCDEF ,
  • и искате да промените ангажиментите B и D (= 2 корекции),

тогава можете да направите:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • създаване на празни корекции (по един за всяко поемане):
    • имате нужда от съобщение за целите на препращането
    • git commit --allow-empty -m "empty"
  • стартирайте операцията за рестартиране
    • git rebase -i B^
    • B^ избира основния елемент B
  • трябва да поставите един празен ангажимент преди за всеки ангажимент да се промени
  • Трябва да смените pick за да ги squash .

Пример за това, което git rebase -i B^ ще ви даде:

 pick sha-commit-B some message pick sha-commit-C some message pick sha-commit-D some message pick sha-commit-E some message pick sha-commit-F some message # pick sha-commit-empty1 empty # pick sha-commit-empty2 empty 

променете го на:

 # change commit B author pick sha-commit-empty1 empty squash sha-commit-B some message # leave commit C alone pick sha-commit-C some message # change commit D author pick sha-commit-empty2 empty squash sha-commit-D some message # leave commit EF alone pick sha-commit-E some message pick sha-commit-F some message 

Той ще ви помоли да редактирате съобщенията:

 # This is a combination of 2 commits. # The first commit message is: empty # This is the 2nd commit message: ...some useful commit message there... 

и можете просто да изтриете първите няколко реда.

12
28 авг. отговорът е даден днозай 28 авг. 2013-08-28 04:03 '13 в 4:03 2013-08-28 04:03

Има още една стъпка към отговора на Амбър, ако използвате централно хранилище:

git push -f да принудите централното хранилище да се актуализира.

Внимавайте да нямате много хора в един клон, защото това може да доведе до загуба на последователност.

11
20 дек. Отговорът е даден от Fabian76 20 декември. 2013-12-20 18:06 '13 в 18:06 2013-12-20 18:06

Фиксирайте пред:

2019

Други въпроси относно тагове или Ask a Question