Tôi muốn thay đổi tên, họ và email trong tất cả các cam kết của mình, điều đó có thể không?
Tôi muốn thay đổi tên, họ và email trong tất cả các cam kết của mình, điều đó có thể không?
Câu trả lời:
Sử dụng 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 "$@"'
Điều này chỉ ảnh hưởng đến tác giả, không phải tác giả (mà đối với hầu hết các cam kết sẽ giống như tác giả). Nếu bạn cũng muốn viết lại chúng, hãy đặt GIT_COMMITTER_NAME
và GIT_COMMITTER_EMAIL
các biến.
Các cảnh báo tiêu chuẩn về viết lại lịch sử áp dụng; chỉ làm điều đó với lịch sử chưa được chia sẻ.
Hướng dẫn hiện bao gồm một giải pháp, sử dụng --env-filter
, trong các ví dụ của nó: 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
, bạn vẫn có quyền truy cập bash
. Mặt khác, tôi không có manh mối.
Để viết lại cả tác giả và commiter trong tất cả các cam kết đã chọn:
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
Nếu không có tác giả khác, bạn có thể làm:
git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \
export GIT_AUTHOR_EMAIL=mail@example.com; git commit-tree "$@"'
Lưu tập lệnh bên dưới như ví dụ ~/.bin/git-replace-author
và chạy nó bằng cách sử dụng, ví dụ:
git replace-author "John Ssmith" "John Smith" "johnsmith@example.com"
Không có đối số, nó cập nhật tất cả các cam kết với tên của bạn để sử dụng địa chỉ email hiện tại của bạn theo cấu hình 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'
Nguyên (để tải về)
~/.bin/
cần phải ở bên trong người dùng $PATH
và tệp cần được thực thi, vì vậy hãy chạy : chmod +x ~/.bin/git-replace-author
.
Chỉ khi bạn không đẩy cam kết của mình ra thế giới. Những người khôn ngoan khác có tên cũ của bạn trong repo của họ mà không chắc bạn có thể thay đổi tên của mọi người.
Với Git 2.24 (Q4 2019), git filter-branch
(và BFG) không được dùng nữa .
Tương đương sẽ là, sử dụng newren/git-filter-repo
và phần ví dụ của nó :
cd repo
git filter-repo --mailmap my-mailmap
với my-mailmap
:
Correct Name <correct@email.com> <old@email.com>
Điều đó sẽ thay thế tên tác giả và email của bất kỳ cam kết nào được thực hiện bởi bất kỳ ai với <old@email.com>
Xem git shortlog
phần tác giả ánh xạ cho cú pháp chính xác của