Kako promijeniti autora predavanja za jednu određenu obvezu?

Želim promijeniti autora jedne određene obveze u povijesti. Ovo nije posljednja obveza.

Znam o ovom pitanju - kako mogu promijeniti autora predavanja u git-u?

Ali razmišljam o nečemu gdje identificiram počinjenje hashom ili kratkim hashom.

1564
15 июня '10 в 7:00 2010-06-15 07:00 MicTech postavljen 15. lipnja '10 u 7:00 2010-06-15 07:00
@ 9 odgovora

Interaktivni rebase iz točke ranije u povijesti nego obvezati trebate promijeniti ( git rebase -i <earliercommit> ). Na popisu premještenih izmjena, promijenite tekst od pick do edit pored oznake raspršivanja koje želite promijeniti. Zatim, kada vas git zatraži da promijenite urezivanje, upotrijebite to:

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

Na primjer, ako je vaša ABCDE-f povijest izdavanja s F HEAD , a želite promijeniti autora C i D , onda biste ...

  1. Navedite git rebase -i B ( evo primjera onoga što ćete vidjeti nakon izvršavanja naredbe git rebase -i B )
    • ako trebate urediti A , upotrijebite git rebase -i --root
  2. promijenite linije za C i D iz pick za edit
  3. Čim počne rebase, najprije će stati na C
  4. Morate napraviti git commit --amend --author="Author Name <email@address.com>"
  5. Zatim git rebase --continue
  6. Ovo će se ponovno zaustaviti na D
  7. Tada morate ponovno git commit --amend --author="Author Name <email@address.com>"
  8. git rebase --continue
  9. Preseljenje će biti dovršeno.
  10. Upotrijebite git push -f da biste ažurirali izvor s ažuriranim unosima.
2672
15 июня '10 в 7:31 2010-06-15 07:31 odgovor je dobio Amber 15. lipnja '10 u 7:31 2010-06-15 07:31

Prihvaćeni odgovor na ovo pitanje je iznenađujuće pametna upotreba interaktivnog preseljenja, ali nažalost to uzrokuje sukobe, ako autor kojeg pokušavamo promijeniti koristi za granu koja je kasnije spojena. U općenitijem slučaju, to ne djeluje pri obradi prljavih priča.

Budući da se bojim pokretanja skripti koje ovise o postavljanju i resetiranju varijabli okruženja da prepišem git povijest, pišem novi odgovor na temelju tog posta, koji je sličan ovom odgovoru, ali je potpuniji.

Sljedeće se testira i radi, za razliku od odgovarajućeg odgovora. Pretpostavimo za jasnoću da je 03f482d6 , čiji autor pokušavamo zamijeniti, a 42627abe je 42627abe s novim autorom.

border=0
  1. Napravite obvezu koju pokušavamo promijeniti.

     git checkout 03f482d6 
  2. Neka autor promijeni.

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

    Sada imamo novu 42627abe s 42627abe jednakom 42627abe .

  3. Provjerite izvornu granu.

  4. Zamijenite stari unos novom lokalno.

     git replace 03f482d6 42627abe 
  5. Ponovno napišite sve buduće prijenose na temelju zamjene.

     git filter-branch -- --all 
  6. Uklonite zamjenu za čistoću.

     git replace -d 03f482d6 
  7. Kliknite na novu povijest (koristite samo --force ako sljedeće ne uspije, i tek nakon provjere funkcionalnosti s git log i / ili git diff ).

     git push --force-with-lease 

Umjesto 4-6, možete se jednostavno prebaciti na novu predaju:

 git rebase -i 42627abe 
369
04 марта '15 в 5:11 2015-03-04 05:11 odgovor je dan merlin2011 4. ožujka u 5:11 2015-03-04 05:11

Github dokumentacija sadrži skriptu koja zamjenjuje podatke o komitentu za sve urezivanja u grani .

150
09 июня '15 в 19:02 2015-06-09 19:02 Odgovor je dao olivieradam666 Lipanj 09 '15 u 19:02 2015-06-09 19:02
  • Ponovno postavite svoju adresu e-pošte u konfiguraciji:

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

  • Sada ponovno postavite autora urezivanja bez uređivanja:

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

82
05 апр. odgovor je dan 05.04 2017-04-05 15:44 '17 u 15:44 2017-04-05 15:44

Možete promijeniti autora zadnjeg urezivanja pomoću naredbe ispod.

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

Međutim, ako želite promijeniti više od jednog imena autora, to je pomalo teško. Morate pokrenuti interaktivnu reinstalaciju, a zatim označiti da je izvršena ispravno, a zatim ih mijenjati jednu po jednu i završiti.

Započnite ponovno podizanje sustava s git rebase -i . Pokazat će ti nešto ovako.

Promijenite ključnu riječ pick kako biste je edit za urezivanja koje želite promijeniti ime autora.

Zatim zatvorite urednik. Za početnike pritisnite Escape , zatim upišite :wq i pritisnite Enter .

Tada ćete vidjeti svoj terminal kao da se ništa nije dogodilo. Vi ste zapravo usred interaktivne permutacije. Sada je vrijeme da promijenite ime autora pomoću naredbe iznad. Ponovno će otvoriti urednika. Zatvorite i nastavite ponovno podizanje sustava s git rebase --continue nastavite. Ponovite isto za iznos popravka koji želite urediti. Možete li se uvjeriti da je interaktivni sažetak završio kada ste primili poruku No rebase in progress? ,

69
29 авг. odgovor je dao Fatih 29 aug. 2015-08-29 03:52 '15 u 3:52 2015-08-29 03:52

Odgovori na pitanje na koje ste povezani su dobri odgovori i pokrivaju vašu situaciju (drugo pitanje je općenitije, jer uključuje ponovno pisanje nekoliko obveza).

Kao izgovor za anketiranje git filter-branch napisao sam skriptu za ponovno upisivanje imena autora i / ili e-pošte autora za ovu predaju:

15 июня '10 в 8:24 2010-06-15 08:24 Odgovor dao Chris Johnsen 15. lipnja '10. U 8:24 2010-06-15 08:24

Kada se pokrene git rebase -i u dokumentu se nalazi ovaj zanimljivi bit:

Ako želite vratiti dvije ili više postavki na jednu, zamijenite naredbu "pick" s drugom i sljedećom obvezom s "squash" ili "fixup" . Ako su urezivanja imala različite autore, presavijeni popravljač će se pripisati autoru prve objave. Predložena poruka urezivanja za presavijeni urezivanje je ulančavanje poruka urezivanja prve naredbe i naredbe s naredbom "squash" , ali izostavlja poruke "fixup" .

  • Ako imate povijest ABCDEF ,
  • i želite promijeniti naredbe B i D (= 2 izvršava),

onda možete učiniti:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • izradi prazne unose (jednu za svaku obvezu):
    • trebate poruku za prosljeđivanje
    • git commit --allow-empty -m "empty"
  • pokrenite ponovno pokretanje
    • git rebase -i B^
    • B^ odabire roditeljski element B
  • trebate staviti jednu praznu obvezu prije za svaku obvezu za promjenu
  • Morate promijeniti pick kako biste ih squash .

Primjer onoga što vam git rebase -i B^ daje:

 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 

promijeni na:

 # 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 

Zamolit će vas da uredite poruke:

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

i možete jednostavno izbrisati prvih nekoliko redaka.

12
28 авг. odgovor je dnozay 28 aug. 2013-08-28 04:03 '13 u 4:03 2013-08-28 04:03

Postoji još jedan korak u odgovoru za Jantar ako koristite središnje spremište:

git push -f kako bi prisilio centralno spremište da se ažurira.

Budite oprezni da nemate puno ljudi u jednoj grani, jer to može dovesti do gubitka dosljednosti.

11
20 дек. Odgovor daje Fabian76 20. prosinca. 2013-12-20 18:06 '13 u 18:06 2013-12-20 18:06

Popravi ispred:

2019

30 июня '18 в 15:16 2018-06-30 15:16 odgovor je dao Eugen Konkov 30. lipnja 18. u 15:16 sati. 2018-06-30 15:16

Ostala pitanja o oznakama ili postavi pitanje