Kaip pakeisti autoriaus ir kelio vardo bei el. Pašto adresus Git'e?

Aš parašiau paprastą mokyklos kompiuterio scenarijų ir padariau pakeitimus „Git“ (repo, kuris buvo klonuotas iš mano kompiuterio namuose). Po keleto įsipareigojimų aš supratau, kad darau viską, kaip root vartotojas.

Ar yra būdas pakeisti šių autorių įsipareigojimus mano vardui?

2100
15 апр. paprašė Flávio Amieiro balandžio 15 d 2009-04-15 06:09 '09, 06:09 2009-04-15 06:09
@ 32 atsakymai
  • 1
  • 2

Jei pakeisite autorių (ar komandą), reikės iš naujo įrašyti visą istoriją. Jei tai gerai ir manote, kad tai verta, turėtumėte patikrinti „ git“ filtravimo šaką . Rankiniame puslapyje yra keli pavyzdžiai, kaip pradėti. Taip pat atkreipkite dėmesį, kad galite naudoti aplinkos kintamuosius, kad pakeistumėte autoriaus vardą, atstovą, datas ir kt. - žr. „ Git man “ skyrių „Aplinkos kintamieji“.

Visų pirma, naudodami šią komandą, galite ištaisyti visus neteisingus autorių pavadinimus ir el. Laiškus visoms šakoms ir žymėms (šaltinis: „ GitHub“ pagalba ):

887
15 апр. Pat Notz atsakymas, pateiktas balandžio 15 d 2009-04-15 06:16 '09, 06:16, 2009-04-15 06:16

Naudojant interaktyvias perkrovimas

Jūs galite padaryti

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

Tada pažymėkite visus savo blogus įvykius kaip redagavimo failo „redagavimą“. Jei taip pat norite pakeisti savo pirmąjį įsipareigojimą, turite rankiniu būdu jį pridėti prie pirmos eilutės perkeliamojo failo (sekite kitų eilučių formatą). Tada, kai git prašo pakeisti kiekvieną įvykį, padarykite

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

Tai pakeis autorių į nurodytą pavadinimą, tačiau jis bus sukonfigūruotas jūsų sukonfigūruotam vartotojui git config user.name ir git config user.email . Jei norite nustatyti, ką jūs nurodote, jis nustatys ir autorių, ir pardavėją:

1465
24 авг. atsakymas suteiktas 24 d. 2009-08-24 06:08 '09, 06:08 am. 2009-08-24 06:08

Taip pat galite:

 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 atsakymą pateikė Rognon gegužės 15 d., 09:15, 2009-05-15 22:15

Vienas įterpimas, bet būkite atsargūs, jei turite daugiafunkcinį saugyklą - tai pakeis visus įrašus, susijusius su to paties (naujo) autoriaus ir pasiuntinio buvimu.

 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 

Nuo linijų iki eilučių (kuri yra įmanoma bash):

501
15 апр. Brian Gianforcaro atsakymas, pateiktas balandžio 15 d 2009-04-15 06:22 '09 6:22 am 2009-04-15 06:22

Taip atsitinka, kai nesukūrėte $ HOME / .gitconfig. Galite ją išspręsti kaip:

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

su git versija 1.7.5.4

209
16 февр. atsakymas pateikiamas lrkwz 16 vas. 2012-02-16 12:46 '12 12:46 2012-02-16 12:46

Už vieną pataisymą:

181
27 апр. atsakymas pateikiamas „ blueyed“ 27 d. 2010-04-27 01:50 '10 ne 1:50 2010-04-27 01:50

Jei tik mažiausi įsipareigojimai turi blogų autorių, galite tai padaryti viduje „ git rebase -i naudodami „ exec komandą ir nustatymą - --amend taip:

 git rebase -i HEAD~6 # as required 

kuris pateikia jums redaguojamą įsipareigojimų sąrašą:

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

Tada pridėkite exec ... --author="..." eilutes exec ... --author="..." po visų linijų su blogais autoriais:

 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 

išsaugoti ir išeiti iš redaktoriaus (paleisti).

Šis sprendimas gali būti ilgesnis nei kai kurie kiti, tačiau tai yra labai kontroliuojama - tiksliai žinau, ką ji daro.

Ačiū @asmeurer už įkvėpimą.

159
08 дек. atsakymą pateikė Alex Brown 08 dec. 2011-12-08 20:05 '11, 20:05, 2011-12-08 20:05

„Github“ turi gražią sprendimą , kuris yra toks skripto scenarijus:

108
07 окт. atsakymą pateikė Olivier Verdier 07 Oct 2010-10-07 12:54 '10, 12:54, 2010-10-07 12:54

Kaip jau minėta, istorijos perrašymas yra pavojingas ir sunaikins kitų žmonių saugyklas.

Bet jei jūs tikrai norite tai padaryti ir esate „bash“ aplinkoje („Linux“ problema nėra, „Windows“ galite naudoti „git bash“, kuris yra su „git“ diegimu), naudokite „ git“ filtravimo šaką :

 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 авг. atsakymą pateikė svick 04 rug . 2010-08-04 03:52 '10 at 3:52 2010-08-04 03:52

Užfiksavus kito autoriaus nepasirengusį įvykį, yra paprastas būdas tai tvarkyti.

git commit --amend --reset-author

46
24 марта '16 в 1:23 2016-03-24 01:23 atsakymą pateikė „ Ryanmt “ kovo 24 d. 16 d. 1:23 2016-03-24 01:23

Tai labiau apgalvota „@Brian“ versijos versija:

Jei norite pakeisti autorių ir priskyrėją, galite tai padaryti (naudodami eilutes eilutėje, kuri yra įmanoma bash):

 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 

Gali prireikti šiek tiek paaiškinimo -- --all : jis veikia su filtru visose visų nuorodų (įskaitant visas šakas) pataisose. Tai reiškia, kad, pavyzdžiui, žymės perrašomos ir matomos perrašytuose filialuose.

Bendra „klaida“ yra naudoti HEAD o tai reiškia, kad filtruojami visi dabartinio filialo pakeitimai. Tada perrašytoje temoje nebus žymių (ar kitų nuorodų).

38
09 дек. atsakymas pateikiamas stigkj 09 dec. 2011-12-09 13:23 '11, 13:23 PM 2011-12-09 13:23

Jį galite naudoti kaip slapyvardį, kad galėtumėte:

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

arba per pastaruosius 10 įsipareigojimų:

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

Pridėti prie ~ / .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 " 

Šaltinis: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

Tikiuosi, kad tai naudinga.

38
02 авг. atsakymas duotas brauliobo 02 rug . 2012-08-02 02:09 '12, 02:09 2012-08-02 02:09
  • paleiskite git rebase -i <sha1 or ref of starting point>
  • pažymėkite visus pakeitimus, kuriuos norite edit (arba e )
  • atlikite šias dvi komandas, kol tvarkysite visus įsipareigojimus:

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

Taip bus išsaugota visa kita įsipareigojimo informacija (įskaitant datas). --reuse-message=HEAD išjungia pranešimo redaktoriaus paleidimą.

23
04 окт. atsakymas duotas sporsh 04 oct. 2012-10-04 05:22 '12 at 5:22 am 2012-10-04 05:22

Aš perrašysiu autorių visai saugyklai, įskaitant žymes ir visus filialus:

filtro šakos MAN puslapyje , ištrinkite visas originalias nuorodas, padarytas pagal filter-branch atsargines kopijas (tai yra destruktyvi, pirmoji atsarginė kopija): 

21
16 февр. Atsakymas pateikiamas Ton van den Heuvel 16 vasario mėn. 2011-02-16 18:27 '11, 18:27, 2011-02-16 18:27

Pritaikiau šį sprendimą , kuris veikia nuryjant paprastą author-conv-file (formatas toks pat, kaip ir git-cvsimport ). Jis veikia, keisdamas visus naudotojus, kaip apibrėžta author-conv-file visoms šakoms.

Tai panaudojome kartu su cvs2git kad mūsų saugykla būtų perkelta iš cvs į git.

tai yra. Pavyzdys author-conv-file

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

scenarijus:

20
05 февр. atsakymas, kurį pateikė Leif Gruenwoldt 05 vasaris 2011-02-05 01:46 '11 at 1:46 2011-02-05 01:46

Radau pateiktus kelią agresyviai, ypač jei darote taisymus iš kitų kūrėjų, tai iš esmės pavogia jų kodą.

Ši versija veikia visuose filialuose, o autorius ir jo atstovas keičiasi atskirai, kad tai būtų išvengta.

Pretenzijos leif81 visoms parinktims.

18
23 апр. atsakymas duotas drahnr 23 Bal 2012-04-23 11:46 '12, 11:46, 2012-04-23 11:46
  • Pakeiskite author name email Amend kuriuo Amend keisti, tada pakeiskite 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 
  • Kitas būdas 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 atsakė į 14 d. 2016-12-14 18:01 '16 at 18:01 PM 2016-12-14 18:01

Turiu pabrėžti, kad jei vienintelė problema yra ta, kad autorius / el. Paštas skiriasi nuo įprastų, tai nėra problema. Teisingas pataisymas yra sukurti failą su pavadinimu .mailmap baziniame kataloge su tokiomis linijomis kaip

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

Nuo šiol komandos, pvz., git shortlog , laikys šiuos du vardus vienodais (nebent jūs juos konkrečiai pasakytumėte). Daugiau informacijos žr. Http://schacon.github.com/git/git-shortlog.html .

Tai yra visų kitų sprendimų privalumas, nes jums nereikia perrašyti istorijos, kuri gali sukelti problemų, jei turite ankstesnę grandinę, ir visada yra geras būdas netyčia prarasti duomenis.

Žinoma, jei darėte kažką panašaus į save, ir tai tikrai turėtų būti kažkas, ir nesvarbu, ar šiuo metu istoriją perrašote, taisymo autoriaus keitimas tikriausiai yra gera idėja priskyrimo tikslams (šiuo atveju siunčiu jus prie mano kito atsakymo čia).

15
29 февр. Atsakymas suteikiamas 29 vasario mėn. 2012-02-29 02:57 '12 at 2:57 2012-02-29 02:57

Jei esate vienintelis šio saugyklos naudotojas, galite perrašyti istoriją, naudodami „ git filter-branch (kaip „ svick“ parašytą ), arba git fast-export / git fast-import plius scenarijų filtrą (kaip aprašyta dokumente, nurodytame docgnome atsakyme ) arba interaktyvus atnaujinimas . Bet bet kuris iš jų pakeistų pakeitimus nuo pirmojo pasikeitusio įsipareigojimo; tai reiškia sunkumus visiems, kurie pakeitė savo filialą prieš perrašymą.

ATNAUJINIMAS

Jei kiti kūrėjai nepagrindė savo darbo su išleidimo versija, paprasčiausias sprendimas būtų pakartotinis klonavimas (pakartotinis klonas).

Arba jie gali pabandyti git rebase --pull , kuris būtų greitai persiųstas, jei jų saugykloje nebūtų jokių pakeitimų, arba vėl persiųstų savo filialą per perrašytus įsipareigojimus (mes norime vengti susijungimo, nes jis išlaiko išankstinę peržiūrą visam laikui). Visa tai rodo, kad jie neturi darbo; naudoti kitokį pakeitimą naudokite git stash .

Jei kiti kūrėjai naudoja funkcijų šakas, ir / arba git pull --rebase neveikia, pavyzdžiui. nes aukštesnioji pakopa nėra sukonfigūruota, jie turi perrašyti savo darbus virš įrašų. Pvz., Gavę naujus pakeitimus ( git fetch ), master filialui, kurio pagrindas yra / origin/masterorigin/master , reikia paleisti

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

Čia origin/master@{1} yra išankstinio įrašo būsena (prieš perkėlimą ), žr.


Alternatyvus sprendimas būtų naudoti „ Ref“ / „pakeisti“ / „ mechanizmas“, prieinamą „Git“ nuo 1.6.5 versijos. Šiame sprendime pateikiate pakeitimus, susijusius su neteisingu el. Pašto adresu; tada kažkas, kas laikosi „ref“ (kažkas panašaus į fetch = +refs/replace/*:refs/replace/* korva fetch = +refs/replace/*:refs/replace/* refspec atitinkamoje jų .git/config ) vietoje, skaidriai gaus pakeitimus ir tuos, kurie negauna šių nuorodų, pamatys senus įsipareigojimus.

Procedūra atrodo taip:

  • Rasti visus įsipareigojimus su neteisingu el. Pašto adresu, pvz., Naudodami

     $ git log --author=user@wrong.email --all 
  • Kiekvienam neteisingam įvykiui sukurkite pakaitinį įvykį ir pridėkite jį prie objekto duomenų bazės.

     $ 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> 
  • Dabar, kai pataisėte įvykio objektą duomenų bazėje, turite pasakyti „Git“, kad automatiškai ir skaidriai pakeistų neteisingą įsipareigojimą, pataisytą su „ git replace :

     $ git replace <ID of wrong commit> <ID of corrected commit> 
  • Galiausiai pažymėkite visą pakeitimą, kad patikrintumėte, ar ši procedūra vykdoma.

     $ git replace -l 

    ir patikrinkite, ar yra pakaitalas

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

Žinoma, galite automatizuoti šią procedūrą ... gerai, viskas, išskyrus „ git replace , kuris neturi (iki šiol) paketinio režimo, todėl jūs turite naudoti apvalkalo kilpą arba pakeisti jį rankiniu būdu.

NERASTA! YMMV.

Atkreipkite dėmesį, kad naudojant refs/replace/ mechanizmą galite susidurti su šiurkščiais kampais: jis yra naujas ir dar gerai išbandytas .

9
04 авг. atsakymas, kurį pateikė Jakub Narębski 04 rug . 2010-08-04 12:41 '10, 12:41, 2010-08-04 12:41

Jei pataisymai, kuriuos norite pataisyti, yra paskutiniai, o tik keli iš jų, galite naudoti git reset ir git stash kombinaciją, kad grįžtumėte prie jų nustatymo po teisingo vardo ir el. Pašto nustatymo.

Tokia seka bus tokia (2 klaidingi įvykiai, nelaukiant pakeitimų):

 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 сент. Djromero atsakymas Rugsėjo 30 d 2011-09-30 21:04 '11, 21:04, 2011-09-30 21:04

Naudodamiesi interaktyviu atnaujinimu, po kiekvieno įsipareigojimo, kurį norite keisti, galite pakeisti pakeitimo komandą. Pavyzdžiui:

 pick a07cb86 Project tile template with full details and styling x git commit --amend --reset-author -Chead 
5
26 февр. atsakymas pateiktas j16r 26 vasaris 2013-02-26 16:19 '13, 16:19, 2013-02-26 16:19

Atkreipkite dėmesį, kad „git“ saugo du skirtingus el. Pašto adresus, vieną - užsakovui (asmeniui, kuris padarė pakeitimą) ir kitą autoriui (asmeniui, kuris parašė pakeitimą).

Daugumoje vietų informacija apie git log -1 --format=%cn,%ce nerodoma, bet ją galite matyti su git log -1 --format=%cn,%ce (arba nurodyti, show vietoj log būtų nurodytas konkretus įsipareigojimas).

Pakeitus paskutinio git commit --amend --author "Author Name <email@example.com>" taip pat lengva, kaip git commit --amend --author "Author Name <email@example.com>" , nėra vienos eilutės ar argumento, kad tai būtų daroma su nario informacija.

Sprendimas yra (laikinai ar ne) pakeisti jūsų naudotojo informaciją ir tada išspręsti įsipareigojimą, kuris atnaujina savo dabartinę informaciją:

 git config user.email my_other_email@example.com git commit --amend 
5
06 дек. Atsakymas, kurį pateikė Sir Athos Dec 06 2013-12-06 00:21 '13 0:21 2013-12-06 00:21

Jei naudojate „Eclipse“ su „EGit“, tai yra gana paprastas sprendimas.
Prielaida: padarėte klaidą vietiniame skyriuje local_master_user_x, kuris negali būti perkeltas į nuotolinio filialo „šeimininką“ dėl neteisingo vartotojo.

  • Patikrinkite nuotolinį filialą „meistras“
  • Pasirinkite projektus / aplankus / failus, kuriuose yra „local_master_user_x“ pakeitimai.
  • Dešiniuoju pelės mygtuku spustelėkite - Pakeisti su - Filialas - „local_master_user_x“
  • Atlikite šiuos pakeitimus dar kartą, šį kartą kaip teisingą vartotoją ir vietinį skyrių „kapitonas“
  • Paspauskite į nuotolinį „šeimininką“
5
24 авг. atsakymą pateikė paphko 24 rug . 2011-08-24 20:54 '11, 20:54, 2011-08-24 20:54

Šiandien susidūrėme su problema, kai autoriaus vardo UTF8 simbolis sukėlė problemų serveryje, todėl turėjome perrašyti istoriją, kad ją išspręstume. Buvo imtasi šių veiksmų:

1 veiksmas: pakeiskite savo git naudotojo vardą į visus būsimus įvykius pagal instrukcijas čia: https://help.github.com/articles/setting-your-username-in-git/

2 veiksmas. Paleiskite šį bash scenarijų:

 #!/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 

Trumpa apžvalga. Pateikite užsakymą laikinajame faile, patikrinkite visus ištrintus filialus, paleiskite scenarijų, kuris perrašys istoriją, atliks naują būseną ir pasakykite visiems savo kolegoms, kaip gauti pakeitimus.

Mes turėjome problemų paleisdami jį OS X sistemoje, nes ji kažkaip sumaišė liniją, kuri baigėsi pranešančiais pranešimais, todėl po to turėjome jį paleisti Linux kompiuteryje.

5
22 окт. Miloš Ranđelović atsakymas spalio 22 d. 2014-10-22 06:32 '14, 6:32 2014-10-22 06:32

Jūsų problema yra labai dažna. Žr. „„ Mailmapnaudojimas„ Gitautorių sąrašo nustatymui

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