Git 修改歷史 commits 中的用戶名和郵箱


一、作用

  • 修改某個倉庫歷史 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 檢查修改成功后,最后別忘了推送到遠程倉庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM