2010-12-20 1 views
98

Ich möchte meinen Namen, Nachnamen und E-Mail in allen meinen Commits ändern, ist es möglich?Kann ich meinen Namen und Nachnamen in allen vorherigen Commits ändern?

+2

Ist es ein reprository nur für Sie, für ein paar Leute oder für ein großes Projekt? – thejh

+3

möglich duplicate of [Wie ändere ich den Autor eines Commits in git?] (Http://stackoverflow.com/questions/750172/how-do-i-change-the-author-of-a-commit-in -git) –

+0

mögliches Duplikat von [Wie überschreibe ich Committer-Namen in einem Git-Repository?] (http://StackOverflow.com/questions/1566809/how-do-rewrite-committer-names-in-a-git -repository) –

Antwort

166

Verwenden Sie git-filter-branch.

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Josh Lee" ]; 
    then export GIT_AUTHOR_NAME="Hobo Bob"; export [email protected]; 
    fi; git commit-tree "[email protected]"' 

Dies betrifft nur den Autor, nicht der Committer (was für die meisten Commits wird das gleiche wie der Autor sein). Wenn Sie diese auch neu schreiben wollen, stellen Sie die Variablen GIT_COMMITTER_NAME und GIT_COMMITTER_EMAIL ein.

Die standard warning über Umschreibungsgeschichte gilt; tue es nur der Geschichte, die noch nicht geteilt wurde.

+0

Aber was tun auf Windows? – Joshua

+3

Wenn Sie 'msysgit' verwenden, haben Sie immer noch Zugriff auf' bash'. Sonst habe ich keine Ahnung. –

+1

@Joshua aktualisiert, weil ich die Committer Info vergessen habe. –

2

Nur wenn Sie Ihre Commits nicht auf die Welt geschoben haben. Ansonsten hat jeder andere Ihren alten Namen in seinem Repo, was unwahrscheinlich ist, dass Sie jeden ändern können.

+0

Wahr, aber in einigen Fällen haben Sie keine Wahl. In meinem Fall hatte ich eine falsche E-Mail-Adresse konfiguriert in meiner git config (wie ich mit "git config --global -l" sehen konnte). Aus diesem Grund hatte ich keine Commit-Aktivität in meinem eigenen Github-Repo (weil die E-Mail-Adresse nicht mit der in Github konfigurierten E-Mail-Adresse übereinstimmte)! Um dies zu beheben, habe ich meine lokalen Commits mit dem Rezept von http://stackoverflow.com/a/23564785/2474068 (funktioniert perfekt) und dann habe ich die geänderten commits nach Github mit "git push -u -f origin master" (mit dem Force-Flag "-f"). Das widerspricht der gängigen Praxis, aber ich hatte keine Wahl! – leo

+1

Ja, mein Punkt war, dass jede Gabelung dieses Repos diese Änderung nicht haben würde, wenn sie Ihren Kraftstoß nicht akzeptierten. Es wäre schwierig, jede Gabel zu aktualisieren :) – EnabrenTane

31

Wenn es keine anderen Autoren sind, können Sie tun:

git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \ 
export [email protected]; git commit-tree "[email protected]"' 
+1

Es ist nicht neu schreiben "Committer:" info. – user11153

+1

Es ist nicht beabsichtigt, Committer-Informationen neu zu schreiben. Wenn Sie dies tun möchten, exportieren Sie auch GIT_COMMITTER_NAME und GIT_COMMITTER_EMAIL (siehe akzeptierte Antwort). – chronospoon

45

Um sowohl Autor und commiter in allen ausgewählten Commits zu umschreiben:

git filter-branch --commit-filter \ 
'if [ "$GIT_AUTHOR_NAME" = "OldAuthor Name" ]; then \ 
export GIT_AUTHOR_NAME="Author Name";\ 
export [email protected];\ 
export GIT_COMMITTER_NAME="Commmiter Name";\ 
export [email protected];\ 
fi;\ 
git commit-tree "[email protected]"' 
+1

Aber wie man Änderungen an Remote-Server anwenden? – vikyd

+2

@Viky Try 'git push --all Herkunft --force' – user11153

+2

Es funktioniert für mich! Ich benutze GitLab, ich muss den Zweig vor dem Push-Befehl aufheben. – vikyd

10

Speichern Sie das Skript unten wie z.B. ~/.bin/git-replace-author und führen Sie es verwenden, z: Ihre aktuelle E-Mail-Adresse verwenden nach Git Config

git replace-author "John Ssmith" "John Smith" "[email protected]" 

Ohne Argumente, aktualisiert sie alle mit Ihrem Namen verpflichtet.

DEFAULT_NAME="$(git config user.name)" 
DEFAULT_EMAIL="$(git config user.email)" 
export OLD_NAME="${1:-$DEFAULT_NAME}" 
export NEW_NAME="${2:-$DEFAULT_NAME}" 
export NEW_EMAIL="${3:-$DEFAULT_EMAIL}" 

echo "Old:" $OLD_NAME "<*>" 
echo "New:" "$NEW_NAME <$NEW_EMAIL>" 
echo "To undo, use: git reset $(git rev-parse HEAD)" 

git filter-branch --env-filter \ 
'if [ "$GIT_AUTHOR_NAME" = "${OLD_NAME}" ]; then 
    export GIT_AUTHOR_NAME="${NEW_NAME}" 
    export GIT_AUTHOR_EMAIL="${NEW_EMAIL}" 
    export GIT_COMMITTER_NAME="${NEW_NAME}" 
    export GIT_COMMITTER_EMAIL="${NEW_EMAIL}" 
fi' 

Raw (zum Download)

+0

Als eine kurze Anmerkung: '~/.bin /' muss in den Benutzern '$ PATH' sein und die Datei muss ausführbar sein, so dass sie laufen : 'chmod + x ~/.bin/git-replace-author'. –

Verwandte Themen