Kako promijeniti ime autora i autora i e-poštu nekoliko urezanih u Git?

Napisao sam jednostavan skriptu u školskom računalu i napravio promjene u Gitu (u repu koji je bio u mom klatnu kloniran iz mog računala kod kuće). Nakon nekoliko pokušaja, shvatio sam da radim stvari kao root korisnik.

Postoji li način da se promijeni autor tih obveza na moje ime?

2100
15 апр. pitao Flávio Amieiro 15. travnja 2009-04-15 06:09 '09 u 6:09 2009-04-15 06:09
@ 32 odgovora
  • 1
  • 2

Promjena autora (ili izvršitelja) zahtijevat će ponovno snimanje cijele priče. Ako ste u redu s ovim i smatrate da je vrijedno toga, trebali biste provjeriti git filter-grane . Stranica s priručnikom sadrži nekoliko primjera za početak. Također imajte na umu da varijable okruženja možete koristiti za promjenu imena autora, izdavača, datuma itd. - pogledajte odjeljak "Varijable okoliša" u git čovjeku .

Konkretno, pomoću ove naredbe možete ispraviti sva netočna imena autora i e-poštu za sve grane i oznake (izvor: GitHub pomoć ):

887
15 апр. Odgovor dao je Pat Notz 15. travnja 2009-04-15 06:16 '09 u 6:16 AM 2009-04-15 06:16

Korištenje interaktivnih rebaza

Mogao bi

 git rebase -i -p <some HEAD before all of your bad commits> 

Zatim označite sve svoje loše poruke kao "uređivanje" u datoteci rebase. Ako želite promijeniti i prvu predaju, ručno je dodajte u prvi redak datoteke rebase (slijedite format drugih redaka). Zatim, kada vas git zatraži da izmijenite svaki urez, napravite

 git commit --amend --author "New Author Name <email@address.com>" --no-edit  \ git rebase --continue 

Pojedinačna fiksacija

Kao što su neki komentatori primijetili, ako samo želite promijeniti zadnju naredbu, naredba rebase nije potrebna. Samo uradi

Napomena o preuzetim obvezama

U mom prvom odgovoru došlo je do malog nedostatka. Ako postoji spajanje između trenutne HEAD i vaše <some HEAD before all your bad commits> , tada će ih git rebase ugladiti (i, usput, ako koristite GitHub upite u vašoj povijesti). To vrlo često može dovesti do vrlo različite priče (budući da se duple promjene mogu "ponovno instalirati"), au najgorem slučaju to može dovesti do git rebase tražeći rješavanje složenih konflikata spajanja (koji su vjerojatno već riješeni u spajanju). ). Rješenje je koristiti zastavicu -p za git rebase , koja će sačuvati strukturu spajanja vaše priče. git rebase upozorava da upotreba -p i -i može dovesti do problema, ali odjeljak BUGS kaže: "Uređivanje urezivanja i prepisivanje poruka urezivanja trebalo bi dobro funkcionirati."

Dodao sam -p gore navedenoj naredbi. U slučaju kada samo promijenite posljednju poruku, to nije problem.

1465
24 авг. odgovor dan asmeurer 24 kol. 2009-08-24 06:08 '09 u 6:08 am 2009-08-24 06:08

Također možete učiniti:

 git filter-branch --commit-filter " if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ]; then GIT_COMMITTER_NAME="<New Name>"; GIT_AUTHOR_NAME="<New Name>"; GIT_COMMITTER_EMAIL="<New Email>"; GIT_AUTHOR_EMAIL="<New Email>"; git commit-tree "$@"; else git commit-tree "$@"; fi" HEAD 
573
15 мая '09 в 22:15 2009-05-15 22:15 odgovor je dao Rognon 15. svibanj '09 u 22:15 2009-05-15 22:15

Jedan umetak, ali budite oprezni ako imate višekorisničko spremište - to će promijeniti sve fiksacije za prisutnost istog (novog) autora i počinitelja.

 git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD 

Od linija do linija (što je moguće u bash-u):

501
15 апр. Odgovor dao Brian Gianforcaro 15. travnja 2009-04-15 06:22 '09 u 6:22 am 2009-04-15 06:22

To se događa kada niste inicijalizirali $ HOME / .gitconfig. Možete ga popraviti kao:

 git config --global user.name "you name" git config --global user.email you@domain.com git commit --amend --reset-author 

s git verzijom 1.7.5.4

209
16 февр. odgovor je dat lrkwz 16. veljače. 2012-02-16 12:46 '12 u 12:46 2012-02-16 12:46

Za jedan popravak:

181
27 апр. odgovor je dan plavom bojom 27 apr. 2010-04-27 01:50 '10 u 1:50 2010-04-27 01:50

U slučaju da samo najmanji unosi imaju loše autore, možete to učiniti sve unutar git rebase -i koristeći naredbu exec i popravak - --amend kako slijedi:

 git rebase -i HEAD~6 # as required 

koji Vam nudi popis izmjena koje se mogu uređivati:

 pick abcd Someone else commit pick defg my bad commit 1 pick 1234 my bad commit 2 

Zatim dodajte exec ... --author="..." linije exec ... --author="..." nakon svih redaka s lošim autorima:

 pick abcd Someone else commit pick defg my bad commit 1 exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD pick 1234 my bad commit 2 exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD 

spremite i izađite iz urednika (za pokretanje).

Ta odluka može biti dulja od neke druge, ali je vrlo kontrolirana - znam točno što radi.

Zahvaljujemo se @asmeureru za inspiraciju.

159
08 дек. odgovor je dao Alex Brown 08 prosinca. 2011-12-08 20:05 '11 u 20:05 2011-12-08 20:05

Github ima lijepo rješenje , koje je sljedeći skriptni skript:

108
07 окт. odgovor je dao Olivier Verdier 07. listopada 2010-10-07 12:54 '10 u 12:54 2010-10-07 12:54

Kao što je gore spomenuto, prepisivanje povijesti je opasno i uništit će tuđa spremišta.

Ali ako doista želite to učiniti, a vi se nalazite u bash okruženju (nema problema na Linuxu, u sustavu Windows možete koristiti git bash, koji dolazi s instalacijom git), koristite granu git filtra :

 git filter-branch --env-filter ' if [ $GIT_AUTHOR_EMAIL = bad@email ]; then GIT_AUTHOR_EMAIL=correct@email; fi; export GIT_AUTHOR_EMAIL' HEAD~20..HEAD 
80
04 авг. odgovor je dao svick 04 aug. 2010-08-04 03:52 '10 u 3:52 2010-08-04 03:52

Prilikom snimanja nepripremljenog učešća od drugog autora, postoji jednostavan način da se to riješi.

git commit --amend --reset-author

46
24 марта '16 в 1:23 2016-03-24 01:23 odgovor je dao Ryanmt 24. ožujka 2011. u 1:23 2016-03-24 01:23

Ovo je zamišljenija verzija @Brian verzije:

Da biste promijenili autora i počinitelja, to možete učiniti (pomoću linija u nizu koji je moguć u bash-u):

 git filter-branch --force --env-filter ' if [ "$GIT_COMMITTER_NAME" = "<Old name>" ]; then GIT_COMMITTER_NAME="<New name>"; GIT_COMMITTER_EMAIL="<New email>"; GIT_AUTHOR_NAME="<New name>"; GIT_AUTHOR_EMAIL="<New email>"; fi' -- --all 

Može biti potrebno malo objašnjenje opcije -- --all : radi s filtrom na svim revizijama svih veza (uključujući sve grane). To znači, na primjer, da su oznake ponovno napisane i vidljive na prepisanim granama.

Uobičajena "pogreška" je umjesto toga koristiti HEAD , što znači filtriranje svih revizija samo za trenutnu granu. A onda u prepisivanom nizu neće biti oznaka (ili drugih veza).

38
09 дек. odgovor je stigkj 09 dec. 2011-12-09 13:23 '11 u 13:23 2011-12-09 13:23

Možete ga upotrijebiti kao pseudonim, tako da možete:

 git change-commits GIT_AUTHOR_NAME "old name" "new name" 

ili za posljednjih 10 urezivanja:

 git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD 

Dodaj u ~ / .gitconfig:

 [alias] change-commits = "!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$'echo $VAR'\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" $@; }; f " 

Izvor: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

Nadam se da je ovo korisno.

38
02 авг. odgovor je dan brauliobo 02 aug. 2012-08-02 02:09 '12 u 2:09 2012-08-02 02:09
  • pokrenite git rebase -i <sha1 or ref of starting point>
  • označite sve obveze koje želite urediti pomoću edit (ili e )
  • izvršite sljedeće dvije naredbe dok ne obradite sve urezivanja:

    git commit --amend --reuse-message=HEAD --author="New Author <new@author.email>" ; git rebase --continue

To će sačuvati sve ostale podatke o urezivanju (uključujući datume). Opcija --reuse-message=HEAD onemogućuje pokretanje uređivača poruka.

23
04 окт. odgovor je dan sporsh 04 okt. 2012-10-04 05:22 '12 u 5:22 am 2012-10-04 05:22

Koristim sljedeće za prepisivanje autora za cijelo spremište, uključujući oznake i sve grane:

na MAN stranici filtracijskog ogranka , izbrišite sve izvorne refs-ove napravljene u sigurnosnim kopijama filter-branch (ovo je destruktivno, prvo sigurnosno kopiranje) 

21
16 февр. Odgovor je dan Ton van den Heuvel 16. veljače. 2011-02-16 18:27 '11 u 18:27 2011-02-16 18:27

Prilagodio sam ovo rješenje , koje djeluje gutanjem jednostavnog author-conv-file (format je isti kao i za git-cvsimport ). Djeluje tako što mijenja sve korisnike, kao što je definirano u author-conv-file za sve grane.

To smo koristili zajedno s cvs2git za prijenos našeg spremišta iz cvs u git.

to jest. Primjer author-conv-file

 john=John Doe <john.doe@hotmail.com> jill=Jill Doe <jill.doe@hotmail.com> 

skripta:

20
05 февр. odgovor Leif Gruenwoldt 05. veljače. 2011-02-05 01:46 '11 u 1:46 2011-02-05 01:46

Otkrio sam da su predstavljene verzije načina agresivne, pogotovo ako napravite ispravke od drugih programera, to u suštini krade njihov kod.

Sljedeća verzija radi u svim granama i mijenja autora i izdavača odvojeno kako bi to spriječila.

Za sve opcije polaže pravo na leif81.

18
23 апр. odgovor dan drahnr 23. travnja 2012-04-23 11:46 '12 u 11:46 2012-04-23 11:46
  • Promijenite author name email adresu author name email na Amend , a zatim zamijenite old-commit with new-one :

     $ git checkout <commit-hash> # checkout to the commit need to modify $ git commit --amend --author "name <author@email.com>" # change the author name and email $ git replace <old-commit-hash> <new-commit-hash> # replace the old commit by new one $ git filter-branch -- --all # rewrite all futures commits based on the replacement $ git replace -d <old-commit-hash> # remove the replacement for cleanliness $ git push -f origin HEAD # force push 
  • Još jedan način Rebasing :

     $ git rebase -i <good-commit-hash> # back to last good commit # Editor would open, replace 'pick' with 'edit' before the commit want to change author $ git commit --amend --author="author name <author@email.com>" # change the author name  email # Save changes and exit the editor $ git rebase --continue # finish the rebase 
17
14 дек. Sajib Khan je odgovorio 14. prosinca. 2016-12-14 18:01 '16 u 18:01 2016-12-14 18:01

Moram naglasiti da ako je jedini problem to što se autor / e-pošta razlikuje od uobičajenog, to nije problem. Ispravna ispravka je izrada datoteke s imenom .mailmap u direktoriju baze s linijama kao što je

 Name you want <email you want> Name you don't want <email you don't want> 

Od sada će naredbe kao što je git shortlog smatrati ta dva imena istima (osim ako ih izričito ne izgovorite). Za detalje pogledajte http://schacon.github.com/git/git-shortlog.html .

To je prednost svih drugih rješenja ovdje da ne morate ponovno pisati povijest, što može uzrokovati probleme ako imate uzvodno, i uvijek je dobar način da slučajno izgubite podatke.

Naravno, ako ste učinili nešto slično sebi, a to bi trebao biti netko drugi, a ne bi vam smetalo da prepisujete priču za trenutak, promjena autora popravka je vjerojatno dobra ideja za svrhe pripisivanja (u ovom slučaju šaljem vam na moj drugi odgovor ovdje).

15
29 февр. Odgovor se daje 29. veljače. 2012-02-29 02:57 '12 u 2:57 2012-02-29 02:57

Ako ste jedini korisnik tog spremišta, možete ponovno pisati povijest pomoću git filter-branch (kao što je svick napisao ) ili git fast-export / git fast-import plus filtar skripte (kao što je opisano u članku na koji upućuje docgnome odgovor ) ili interaktivna rebase . No, bilo koji od njih bi promijenio promjene od prve izmijenjene obveze; to znači poteškoće za svakoga tko je svoje promjene temeljio na svojoj grani prije ponovnog pisanja.

OPORAVAK

Ako drugi programeri nisu bazirali svoj rad na verziji prije objavljivanja, najlakše bi bilo re-clone (re-clone).

Alternativno, oni mogu pokušati git rebase --pull , koji bi se brzo proslijedio ako nije bilo promjena u njihovom spremištu, ili ponovno povezati svoju granu preko prepisanih obveza (želimo izbjeći spajanje, jer će zadržati predreviziju zauvijek). Sve to sugerira da oni nemaju posao; upotrijebite git stash da biste odbacili izmjene.

Ako drugi programeri koriste funkciju grane, i / ili git pull --rebase ne radi, na primjer. jer uzvodno nije konfigurirano, nakon prepisivanja moraju ponovno napraviti svoj rad na vrhu zapisa. Na primjer, nakon primitka novih izmjena ( git fetch ), za master granu na temelju / račvasto od origin/master morate pokrenuti

 $ git rebase --onto origin/master origin/master@{1} master 

Ovdje je origin/master@{1} stanje prije zapisivanja (prije dohvaćanja), vidi gitrevisions .


Alternativno rješenje bilo bi korištenje refs / replace / mehanizma dostupnog u Git-u od verzije 1.6.5. U ovom rješenju pružate zamjene za urezivanje s pogrešnom adresom e-pošte; onda netko tko uzme "ref" (nešto poput fetch = +refs/replace/*:refs/replace/* refspec na odgovarajućem mjestu u njihovom .git/config ) primit će zamjene transparentno, a oni koji ne dohvati ove veze vidjet će stare stavke.

Postupak izgleda ovako:

  • Nađi sve izvršava s pogrešne adrese e-pošte, na primjer, koristeći

     $ git log --author=user@wrong.email --all 
  • Za svaku pogrešnu naredbu stvorite zamjensku predaju i dodajte je u objektnu bazu podataka.

     $ git cat-file -p <ID of wrong commit> | sed -e 's/user@wrong\.email/user@example.com/g' > tmp.txt $ git hash-object -t commit -w tmp.txt <ID of corrected commit> 
  • Sada kada ste ispravili urezivanje u objektnoj bazi podataka, trebate reći Gitu da automatski i transparentno zamijeni netočnu naredbu, ispravljeno pomoću git replace :

     $ git replace <ID of wrong commit> <ID of corrected commit> 
  • Naposljetku navedite cijelu zamjenu kako biste provjerili provodi li se taj postupak.

     $ git replace -l 

    i provjerite postoji li zamjena

     $ git log --author=user@wrong.email --all 

Možete, naravno, automatizirati ovu proceduru ... dobro, sve osim uporabe git replace , koji nema (do sada) batch način rada, tako da morate koristiti petlja ljuske za to ili ga zamijeniti ručno.

NIJE FIKSIRANA! YMMV.

Imajte na umu da prilikom korištenja refs/replace/ mehanizma možete naići na neke grube kutove: to je novo i još nije dobro testirano .

9
04 авг. odgovor dao Jakub Narębski 04 aug. 2010-08-04 12:41 '10 u 12:41 2010-08-04 12:41

Ako su popravci koje želite popraviti posljednji, a samo nekoliko njih, možete upotrijebiti kombinaciju git reset i git stash kako biste se vratili na popravak nakon postavljanja ispravnog imena i e-pošte.

Redoslijed će biti nešto slično (za 2 pogrešna urezivanja, bez čekanja na promjene):

 git config user.name <good name> git config user.email <good email> git reset HEAD^ git stash git reset HEAD^ git commit -a git stash pop git commit -a 
6
30 сент. Odgovor djromero 30. rujna 2011-09-30 21:04 '11 u 21:04 2011-09-30 21:04

Pomoću interaktivne rebase možete unijeti naredbu promjene nakon svakog urezivanja koje želite promijeniti. Na primjer:

 pick a07cb86 Project tile template with full details and styling x git commit --amend --reset-author -Chead 
5
26 февр. odgovor je dan j16r 26. veljače. 2013-02-26 16:19 '13 u 16:19 2013-02-26 16:19

Imajte na umu da git pohranjuje dvije različite adrese e-pošte, jednu za počinitelja (osoba koja je napravila promjenu) i drugu za autora (osobu koja je napisala promjenu).

Informacije o počiniteljima nisu prikazane na većini mjesta, ali možete ih vidjeti pomoću git log -1 --format=%cn,%ce (ili pomoću show umjesto log označiti određenu obvezu).

Promjena autora zadnjeg git commit --amend --author "Author Name <email@example.com>" je jednostavna kao git commit --amend --author "Author Name <email@example.com>" , ne postoji niti jedan redak niti argument koji bi učinio isto s podacima o članu.

Rješenje je (privremeno ili ne) za promjenu korisničkih podataka, a zatim popravak urezivanja, koje ažurira izdavača na vaše trenutne informacije:

 git config user.email my_other_email@example.com git commit --amend 
5
06 дек. Odgovor dao Ath Athos 6. prosinca 2013-12-06 00:21 '13 u 0:21 2013-12-06 00:21

Ako koristite Eclipse s EGit-om, onda postoji prilično jednostavno rješenje.
Pretpostavka: pogriješili ste u lokalnoj podružnici local_master_user_x, koja se ne može prenijeti na "master" udaljene grane zbog nevažećeg korisnika.

  • Provjerite "master" udaljenog ogranka
  • Odaberite projekte / mape / datoteke za koje local_master_user_x sadrži promjene.
  • Kliknite desnom tipkom miša - Zamijeni s - Podružnica - "local_master_user_x"
  • Ponovno dovršite te promjene, ovaj put kao točan korisnik iu lokalnoj podružnici "master"
  • Push to remote 'master'
5
24 авг. odgovor daje paphko 24 aug. 2011-08-24 20:54 '11 u 20:54 2011-08-24 20:54

Danas smo naišli na problem kada je UTF8 znak u imenu autora uzrokovao probleme na poslužitelju izgradnje, pa smo morali ponovno pisati povijest kako bismo je popravili. Poduzeti su sljedeći koraci:

Korak 1: Promijenite svoje git korisničko ime na sva buduća izvršenja prema uputama ovdje: https://help.github.com/articles/setting-your-username-in-git/

Korak 2. Pokrenite sljedeću bash skriptu:

 #!/bin/sh REPO_URL=ssh://path/to/your.git REPO_DIR=rewrite.tmp # Clone the repository git clone ${REPO_URL} ${REPO_DIR} # Change to the cloned repository cd ${REPO_DIR} # Checkout all the remote branches as local tracking branches git branch --list -r origin/* | cut -c10- | xargs -n1 git checkout # Rewrite the history, use a system that will preseve the eol (or lack of in commit messages) - preferably Linux not OSX git filter-branch --env-filter ' OLD_EMAIL="me@something.com" CORRECT_NAME="New Me" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" fi ' --tag-name-filter cat -- --branches --tags # Force push the rewritten branches + tags to the remote git push -f # Remove all knowledge that we did something rm -rf ${REPO_DIR} # Tell your colleagues to `git pull --rebase` on all their local remote tracking branches 

Kratak pregled. Stavite narudžbu u privremenu datoteku, označite sve izbrisane grane, pokrenite skriptu koja će prepisati priču, izraditi novi status i reći svim kolegama kako primiti promjene.

Imali smo problema s pokretanjem OS X-a jer je na neki način pomiješala kraj linije u porukama urezivanja, pa smo ga nakon toga morali ponovno pokrenuti na Linux stroju.

5
ответ дан Miloš Ranđelović 22 окт. '14 в 6:32 2014-10-22 06:32

Ваша проблема очень распространена. См. " Использование Mailmap для исправления списка авторов в Git "

Для простоты я создал script, чтобы облегчить процесс: git-changemail