Git 修改歷史 commits 中的使用者名稱和郵箱
阿新 • • 發佈:2021-07-13
一、作用
- 修改某個倉庫歷史 commit 的使用者 name 和 email 資訊。
- 將歷史提交記錄中的指定 name/email 修改為新的 name/email。
二、步驟
- 確認本地全域性郵箱/使用者名稱
- 檢視倉庫的歷史提交資訊
- 批量修改歷史記錄中的資訊
- 將修改結果推送到遠端
1. 確認本地全域性郵箱/使用者名稱
使用下面兩個命令檢視 git 在本地的全域性郵箱和使用者名稱。
bashgit config user.name git config user.email
如果需要修改 git 在本地的全域性郵箱和使用者名稱,執行下面的命令。
bashgit 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改成自己的新舊郵箱使用者名稱。
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
可以看到已經修改成功。
特殊情況:
如果上面的批量修改命令執行失敗的話,執行一下這段命令:
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD
再次複製貼上批量修改的程式碼並按回車執行。
4. 將修改結果推送到遠端
這時候雖然本地修改成功了,但是你還沒有推送到遠端。
所以再執行一下命令:
git push origin --force --all
去看一下 Github 你就會發現之前的提交記錄中,name 和 email 資訊都更新了。
三、Linux/Mac下可以寫個指令碼
在專案根目錄下建立git-email.sh
,寫入下面這段程式碼:
#!/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
然後需要賦予執行許可權:
bashchmod +x git-email.sh
執行一下這個.sh
檔案:
./git-email.sh
git log
檢查修改成功後,最後別忘了推送到遠端倉庫。