如何批量更改 commit 的郵箱
---日期: Jul 13, 2016
標籤:
- GitHub
- Shell(命令行殼層)
語言: English 正體中文
---
這篇文章已經超過 7 年了。如果這是篇技術性文章,它很大可能已經不再有效,但是你可以嘗試它並檢查它是否仍然有效。
最近,我在編寫一款掛載在GitHub的程序,但我突然發現我的Git狀態好像不太對。。。
作為一個GitHub上的碼農,這種事很頭疼啊!不過我看了下Visual Studio裏的Git歷史,我才發現這是微軟的鍋:
厲害了我的軟。
還好,GitHub 提供了一個叫修改作者信息的功能。但是,這段文字看完後,萌新們可能會一臉蒙逼。而且,這個功能只支持一個郵箱。所以説呢,我就在這兒重寫了指引。
修改作者信息
為了修改已有的commit作者信息,你需要重寫你的Git Repo的全部歷史。
這一動作將會對你的Repo歷史造成毀滅性的修改。如果你與多人協作,這會並不是一個恰當的行為。只有在必須時才進行修改。
使用Script修改Git Repo的全部歷史
我們創建了一個Script以助於修改舊的作者信息至新的作者信息。
運行這段代碼會重寫所有歷史。完成後,其他協作的人必須fetch新的Repo以寫入數據。
在運行前,你需要:
- 準備修改的目標郵箱
- 正確的作者信息
步驟:
-
打開Git Bash.
-
創建一個全新的bare clone:
1
2git clone --bare https://github.com/*user*/*repo*.git
cd *repo*.git -
複製以下的代碼到一個編輯器,並修改以下常量:
OLD_EMAIL
準備修改的目標郵箱CORRECT_NAME
修改後的名字CORRECT_EMAIL
修改後的郵箱
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# see https://help.github.com/articles/changing-author-info/
git filter-branch --env-filter '
OLD_EMAIL=(
"your-old-email@example.com"
"another-old-email@example.com"
"your-git-email@users.noreply.github.com"
)
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
for NEW_EMAIL in ${OLD_EMAIL[@]}; do
if [ "$GIT_COMMITTER_EMAIL" == "$NEW_EMAIL" ]; then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" == "$NEW_EMAIL" ]; then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
done
' --tag-name-filter cat -- --branches --tags -
在剛剛克隆的文件夾裏保存為git-author-rewrite.sh。
-
在Git Bash內運行以下代碼:
1
sh git-author-rewrite.sh
-
常看新的Git歷史是否有錯誤。
-
推送修改後的歷史到GitHub:
1
git push --force --tags origin 'refs/heads/*'
-
移除這一臨時Clone:
1
2cd ..
rm -rf *repo*.git