Як змяніць аўтара камітаў для аднаго канкрэтнага камітаў?

Я хачу змяніць аўтара аднаго канкрэтнага камітаў у гісторыі. Гэта не апошні комм.

Я ведаю пра гэта пытанне - як мне змяніць аўтара камітаў ў git?

Але я думаю пра што-то, дзе я Ідэнтыфікую комм па хешу або кароткім хешу.

1564
15 июня '10 в 7:00 2010-06-15 07:00 зададзены MicTech 15 чэрвеня '10 ў 7:00 2010-06-15 07:00
@ 9 адказаў

Інтэрактыўная перебазировка з пункту раней у гісторыі, чым комм, які вам трэба змяніць ( 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 да 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 адказ дадзены Amber 15 чэрвеня '10 у 07:31 2010-06-15 07:31

Прынятым адказам на гэтае пытанне з'яўляецца дзіўна разумнае выкарыстанне інтэрактыўнага перабазавання, але, на жаль, яно выклікае канфлікты, калі комм, які мы спрабуем змяніць, аўтар выкарыстаў для галінкі, якая ў далейшым была аб'яднаная. У больш агульным выпадку, гэта не працуе пры апрацоўцы брудных гісторый.

Паколькі я асцерагаюся запуску скрыптоў, якія залежаць ад ўстаноўкі і скіду зменных асяроддзя для перазапісу гісторыі git, я пішу новы адказ на аснове гэтай пасады, які падобны на гэты адказ, але з'яўляецца больш поўным.

Наступнае праверана і працуе, у адрозненне ад звязанага адказу. Выкажам здагадку для яснасці выкладу, што 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 у 05: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 апр. адказ дадзены pravbeatle 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 у 03:52 2015/08/29 03:52

Адказы на пытанне, на які вы звязаны, з'яўляюцца добрымі адказамі і ахопліваюць вашу сітуацыю (іншае пытанне больш агульны, паколькі ён уключае ў сябе перапісванне некалькіх камітаў).

У якасці падставы для апытання git filter-branch я напісаў script, каб перапісаць імя аўтара і / або аўтарскую электронную пошту для дадзенай фіксацыі:

15 июня '10 в 8:24 2010-06-15 08:24 адказ дадзены Chris Johnsen 15 чэрвеня '10 у 08:24 2010-06-15 08:24

Пры выкананні git rebase -i ёсць гэты цікавы біт у дакуменце:

Калі вы хочаце скінуць дзве або больш камітаў ў адну, заменіце каманду "pick" на другую і наступную фіксацыю з дапамогай "squash" або "fixup" . Калі ў камітаў былі розныя аўтары, складзены фіксаж будзе прыпісаны аўтару першага камітаў. Прапанаванае паведамленне фіксацыі для складзенага фіксацыі ўяўляе сабой канкатэнацыяй паведамленняў фіксацыі першага фіксацыі і каманд з камандай "squash" , але апускае паведамлення фіксацыі камітаў з дапамогай каманды "fixup" .

  • Калі ў вас ёсць гісторыя ABCDEF ,
  • і вы хочаце змяніць commits 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 .
  • вам трэба змясціць адзін пусты commit да для кожнай фіксацыі для змены
  • вам трэба змяніць 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 авг. адказ дадзены dnozay 28 жнів. 2013-08-28 04:03 '13 у 04: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

Іншыя пытанні па пазнаках або Задайце пытанне