Git, herschrijf eerdere commit-gebruikersnamen en e-mails

Ik heb een aantal commits gedaan aan een project op Github, maar ik realiseerde me dat ik niet de juiste e-mail en de volledige naam van de committer had ingesteld op de computer die ik momenteel gebruik om mijn commits te maken en daarom de avatar van de gebruiker en e-mailadres zijn er niet.

Hoe kan ik alle eerdere commit-e-mail en gebruikersnamen herschrijven?


Antwoord 1, autoriteit 100%

U kunt deze alias toevoegen:

git config --global 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"

De auteursnaam wijzigen:

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

of de e-mail voor alleen de laatste 10 commits:

git change-commits GIT_AUTHOR_EMAIL "[email protected]" "[email protected]" HEAD~10..HEAD

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"

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


Antwoord 2, autoriteit 41%

Zie hier:

git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

Antwoord 3, autoriteit 22%

Als je al een aantal van je commits naar de openbare repository hebt gepusht, nietwil je dit doen, anders zou het een alternatieve versie van de mastergeschiedenis maken die anderen mogelijk hebben gebruikt. “Steek de stromen niet over… Het zou erg zijn…”

Dat gezegd hebbende, als het alleen de commits zijn die je hebt gemaakt naar je lokale repository, repareer dit dan in ieder geval voordat je naar de server pusht. Je kunt het git filter-branchcommando gebruiken met de --commit-filteroptie, zodat het alleen commits bewerkt die overeenkomen met je onjuiste info, zoals dit:

git filter-branch --commit-filter '
      if [ "$GIT_AUTHOR_EMAIL" = "wrong_email@wrong_host.local" ];
      then
              GIT_AUTHOR_NAME="Your Name Here (In Lights)";
              GIT_AUTHOR_EMAIL="correct_email@correct_host.com";
              git commit-tree "$@";
      else
              git commit-tree "$@";
      fi' HEAD

Antwoord 4, autoriteit 9%

Na het toepassen van het antwoord van Olivier Verdier:

git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

…om de gewijzigde geschiedenis naar de oorspronkelijke repository te pushen:

git push origin +yourbranch

Het bovenstaande commando (let op de plus) dwingt ook de geschiedenis op de originele repo te herschrijven. Wees voorzichtig!

Nogmaals, WAARSCHUWING: dit maakt ALLE commits zoals vastgelegd door Newname/newemail! Het scenario is dat je een opslagplaats hebt met slechts één auteur die per ongeluk verschillende identiteiten heeft gebruikt en je wilt dit oplossen.


Antwoord 5, autoriteit 7%

https://help.github.jp/enterprise /2.11/user/articles/change-author-info/

#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="yourName"
CORRECT_EMAIL="yourEmail"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

dit werkte helemaal voor mij. Zorg ervoor dat u na git push de update op de webportal van git ziet. Als de commit nog steeds niet aan mijn account was gekoppeld, standaard miniatuurafbeelding naast de commit werd weergegeven en niet werd weergegeven in de tijdlijngrafiek van mijn bijdragen, ga dan naar de commit-url en voeg .patch toe aan het einde van de url, en verifieer de naam en e-mailadres zijn correct.


Antwoord 6, autoriteit 5%

Het gebruik van git-filter-branchis niet gewenst, om hetzelfde te doen in git-filter-repo( je moet het misschien eerst installeren met pip install git-filter-repo):

git-filter-repo --name-callback 'return name.replace(b"OldName", b"NewName")' --email-callback 'return email.replace(b"[email protected]", b"[email protected]")'

Als de repository origineel is, zonder afstandsbediening, moet je --forcetoevoegen om herschrijven te forceren. (Misschien wilt u een back-up van uw opslagplaats maken voordat u dit doet.)

Als je refs niet wilt behouden (ze worden weergegeven in de branch-geschiedenis van Git GUI), moet je --replace-refs delete-no-addtoevoegen.

Voor meer geavanceerde functies, zie “Filteren van namen en e-mails”.

P.S. Gestolen en verbeterd van https://stackoverflow.com/a/59591928/714907.


Antwoord 7, autoriteit 3%

Voor degenen die alleen de eenvoudige versie voor kopiëren en plakken willen (afgezien van het bijwerken van e-mails en namen):

git config 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 "
git change-commits GIT_AUTHOR_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_AUTHOR_EMAIL <[email protected]> <[email protected]> -f
git change-commits GIT_COMMITTER_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_COMMITTER_EMAIL <[email protected]> <[email protected]> -f

Antwoord 8

Een alternatief voor het herschrijven van de geschiedenis, als je vooral geeft om de weergavenamen van de lokale repo’s, is de .mailmap file, dat in feite een lijst met namen en e-mails is. Plaats dit bijvoorbeeld in een .mailmap-bestand in de hoofdmap van een repo:

Tamika Page <[email protected]>
Orlando Cervantes <[email protected]> Orlando Jackson <[email protected]>
Jared Michael <[email protected]> <jared@desktop.(none)>

zal ertoe leiden dat alle commits toegeschreven aan [email protected]worden getoond met de naam Tamika Page, ongeacht de Committer Name, commits toegeschreven aan Orlando Jackson <[email protected]>wordt weergegeven als Orlando Cervantes, en de vervelende <jared@desktop.(none)>commits worden toegeschreven aan [email protected]. Bekijk voor volledige details de git-documentatievoor deze functie – aangezien deze in git it is ingebouwd zou moeten werken voor elke redelijk nieuwe git-client.

Er is hier echter een groot voorbehoud: hoewel het al een tijdje wordt ondersteund in de officiële git-client, is ondersteuning in verschillende git-implementaties, met name de grote webinterfaces, niet gegarandeerd – zie deze vraag, waar de consensus over de vraag of GitHub het respecteert gemengd is, maar negatief lijkt. Ik heb snelle testrepo’s gecombineerd op GitHuben GitLaben geen van beide lijkt te letten op .mailmap, helaas.

Zoals vermeld in @paradocslover’s antwoord, hebben de services hun eigen interfaces om soortgelijke dingen te doen, maar u moet dat per service, en het heeft helemaal geen invloed op uw lokale kopie. Omdat .mailmapdeel uitmaakt van de repo, zal het zallokaal werken voor iedereen die je repo kloont (je kunt de repo’s die hierboven zijn gelinkt klonen om het zelf te zien), maar het lijkt erop dat het wordt niet weergegeven in de webinterfaces die ik heb getest.

In sommige gevallen wil je natuurlijk de geschiedenis herschrijven, maar dat kan nogal ingrijpend zijn en wordt geleverd met alle standaard waarschuwingen, dus voor sommige situaties is het fijn om deze optie te hebben, die voldoende kan zijn, vooral als het herschrijven is niet praktisch.


Antwoord 9

De reeds aanwezige antwoorden zijn compleet. Maar weet je zeker dat je die nodig hebt? Voor bijv. Ik werd geconfronteerd met een soortgelijk probleem, maar de antwoorden hier waren overdreven voor dat geval. Mijn geval en de oplossing worden hieronder beschreven:

Stel dat je twee e-mail-ID’s hebt, [email protected]en [email protected]. Het is mogelijk dat de vorige commits via [email protected]zijn gedaan, wat niet het gewenste e-mailadres is. In dat geval is een optie om eenvoudig [email protected]te koppelen aan je GitHub-account.

Hoe het te doen?

Vind de optie om de e-mail toe te voegen in het gedeelte E-mails op de instellingenpagina.

voer hier de afbeeldingsbeschrijving in

Nog steeds verloren?

De eerste drie stappen vermeld op de github-paginais voldoende.

OPMERKING:

  1. Github ondersteunt meerdere e-mail-ID’s voor één github-account.
  2. Omdat je de e-mail-ID niet vervangt, maar gewoon een nieuwe toevoegt, zijn commits via beide e-mail-ID’s gekoppeld aan je Github-account.
  3. Het is niet nodig dat [email protected]wordt ingesteld als primaire e-mail-ID.

Other episodes