Saya ingin mengubah nama, nama keluarga dan email saya di semua komitmen saya, apakah itu mungkin?
Saya ingin mengubah nama, nama keluarga dan email saya di semua komitmen saya, apakah itu mungkin?
Jawaban:
Gunakan 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 "$@"'
Ini hanya memengaruhi penulis, bukan pelaku (yang untuk sebagian besar komitmen akan sama dengan penulis). Jika Anda ingin menulis ulang juga, setel variabel GIT_COMMITTER_NAME
dan GIT_COMMITTER_EMAIL
.
The peringatan standar tentang menulis ulang sejarah berlaku; lakukan hanya untuk sejarah yang belum dibagikan.
Manual ini sekarang menyertakan solusi, menggunakan --env-filter
, dalam contohnya: 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
, Anda masih memiliki akses ke bash
. Kalau tidak, saya tidak tahu.
Untuk menulis ulang penulis dan komiter di semua komit yang dipilih:
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
Jika tidak ada penulis lain, Anda dapat melakukan:
git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \
export GIT_AUTHOR_EMAIL=mail@example.com; git commit-tree "$@"'
Simpan script di bawah sebagai contoh ~/.bin/git-replace-author
dan jalankan dengan menggunakan, contoh:
git replace-author "John Ssmith" "John Smith" "johnsmith@example.com"
Tanpa argumen, itu memperbarui semua komit dengan nama Anda untuk menggunakan alamat email Anda saat ini sesuai dengan konfigurasi Git.
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 (untuk mengunduh)
~/.bin/
perlu berada di dalam pengguna $PATH
dan kebutuhan file yang akan dieksekusi, jadi lari: chmod +x ~/.bin/git-replace-author
.
Hanya jika Anda belum memaksakan komitmen Anda pada dunia. Bijak lainnya, orang lain memiliki nama lama Anda di repo mereka yang tidak mungkin Anda dapat mengubah semua orang.
Dengan Git 2.24 (Q4 2019), git filter-branch
(dan BFG) tidak digunakan lagi .
Persamaannya adalah, using newren/git-filter-repo
, dan contoh bagiannya :
cd repo
git filter-repo --mailmap my-mailmap
dengan my-mailmap
:
Correct Name <correct@email.com> <old@email.com>
Itu akan menggantikan nama penulis dan email dari setiap komit yang dilakukan oleh siapa pun dengan <old@email.com>
Lihat git shortlog
bagian penulis pemetaan untuk sintaks yang tepat