Ich möchte meinen Vor- und Nachnamen sowie meine E-Mail-Adresse in allen Commits ändern. Ist dies möglich?
Ich möchte meinen Vor- und Nachnamen sowie meine E-Mail-Adresse in allen Commits ändern. Ist dies möglich?
Antworten:
Verwenden Sie git-filter-branch
.
git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Josh Lee" ];
then export GIT_AUTHOR_NAME="Hobo Bob"; export GIT_AUTHOR_EMAIL=hobo@example.com;
fi; git commit-tree "$@"'
Dies betrifft nur den Autor, nicht den Committer (der für die meisten Commits mit dem Autor identisch ist). Wenn Sie diese ebenfalls neu schreiben möchten, legen Sie die Variablen GIT_COMMITTER_NAME
und fest GIT_COMMITTER_EMAIL
.
Es gilt die Standardwarnung zum Umschreiben des Verlaufs. Machen Sie es nur mit der Geschichte, die noch nicht geteilt wurde.
Das Handbuch enthält jetzt eine Lösung, die --env-filter
in ihren Beispielen Folgendes verwendet : https://git-scm.com/docs/git-filter-branch#_examples :
git filter-branch --env-filter '
if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
then
GIT_AUTHOR_EMAIL=john@example.com
fi
if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
then
GIT_COMMITTER_EMAIL=john@example.com
fi
' -- --all
msysgit
, haben Sie weiterhin Zugriff auf bash
. Ansonsten habe ich keine Ahnung.
So schreiben Sie sowohl den Autor als auch den Commiter in allen ausgewählten Commits neu:
git filter-branch --commit-filter \
'if [ "$GIT_AUTHOR_NAME" = "OldAuthor Name" ]; then \
export GIT_AUTHOR_NAME="Author Name";\
export GIT_AUTHOR_EMAIL=authorEmail@example.com;\
export GIT_COMMITTER_NAME="Commmiter Name";\
export GIT_COMMITTER_EMAIL=commiterEmail@example.com;\
fi;\
git commit-tree "$@"'
git push --all origin --force
Wenn es keine anderen Autoren gibt, können Sie Folgendes tun:
git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \
export GIT_AUTHOR_EMAIL=mail@example.com; git commit-tree "$@"'
Speichern Sie das folgende Skript als zB ~/.bin/git-replace-author
und führen Sie es aus mit zB:
git replace-author "John Ssmith" "John Smith" "johnsmith@example.com"
Ohne Argumente werden alle Commits mit Ihrem Namen aktualisiert, um Ihre aktuelle E-Mail-Adresse gemäß der Git-Konfiguration zu verwenden.
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)
~/.bin/
muss sich innerhalb der Benutzer befinden $PATH
und die Datei muss ausführbar sein, also führen Sie Folgendes aus : chmod +x ~/.bin/git-replace-author
.
Nur wenn Sie Ihre Verpflichtungen nicht in die Welt gedrängt haben. Andernfalls hat jeder andere Ihren alten Namen in seinem Repo, was unwahrscheinlich ist, dass Sie den Namen aller ändern können.
Mit Git 2.24 (Q4 2019) ist git filter-branch
(und BFG) veraltet .
Das Äquivalent wäre, using newren/git-filter-repo
und sein Beispielabschnitt :
cd repo
git filter-repo --mailmap my-mailmap
mit my-mailmap
:
Correct Name <correct@email.com> <old@email.com>
Dies würde den Namen des Autors und die E-Mail-Adresse eines Commits ersetzen, das von jemandem mit ausgeführt wurde <old@email.com>
Siehe git shortlog
Abbildung Autor Abschnitt für die genaue Syntax