一、作用
- 修改某個倉庫歷史 commit 的用戶 name 和 email 信息。
- 將歷史提交記錄中的指定 name/email 修改為新的 name/email。
二、步驟
- 確認本地全局郵箱/用戶名
- 查看倉庫的歷史提交信息
- 批量修改歷史記錄中的信息
- 將修改結果推送到遠程
1. 確認本地全局郵箱/用戶名
使用下面兩個命令查看 git 在本地的全局郵箱和用戶名。
bash
git config user.name git config user.email
如果需要修改 git 在本地的全局郵箱和用戶名,執行下面的命令。
bash
git config --global user.name "輸入你的用戶名" git config --global user.email "輸入你的郵箱"
現在我們已經設置好了本地 git 的 user.name 和 user.email 信息。
2. 查看倉庫的歷史提交信息
git clone
你要修改的倉庫,進入該倉庫目錄,打開 git bash 界面,執行 git log
命令查看歷史提交信息(重點關注 Author)。
3. 批量修改歷史記錄中的信息
打開一個文本編輯器,粘貼下面代碼。
然后把 OLD_EMAIL,CORRECT_NAME,CORRECT_EMAIL 改成自己的新舊郵箱用戶名。
bash
git filter-branch -f --env-filter ' OLD_EMAIL="原來的郵箱" CORRECT_NAME="現在的名字" CORRECT_EMAIL="現在的郵箱" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' --tag-name-filter cat -- --branches --tags
回到 git bash 界面,復制粘貼上面的代碼並按回車執行。
如果 commit 記錄比較多的話執行的時間會比較長。
等待執行完成后,再查看 git log
可以看到已經修改成功。
特殊情況:
如果上面的批量修改命令執行失敗的話,執行一下這段命令:
bash
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD
再次復制粘貼批量修改的代碼並按回車執行。
4. 將修改結果推送到遠程
這時候雖然本地修改成功了,但是你還沒有推送到遠程。
所以再執行一下命令:
bash
git push origin --force --all
去看一下 Github 你就會發現之前的提交記錄中,name 和 email 信息都更新了。
三、Linux/Mac下可以寫個腳本
在項目根目錄下創建 git-email.sh
,寫入下面這段代碼:
bash
#!/bin/sh git filter-branch --env-filter ' OLD_EMAIL="原來的郵箱" CORRECT_NAME="現在的名字" CORRECT_EMAIL="現在的郵箱" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' --tag-name-filter cat -- --branches --tags
然后需要賦予執行權限:
bash
chmod +x git-email.sh
執行一下這個 .sh
文件:
bash
./git-email.sh
git log
檢查修改成功后,最后別忘了推送到遠程倉庫。