變更所有git Author資訊

變更所有git Author資訊

使用git好長一段時間,但都利用Source Tree幫助我做版本控制,結果看著長長的commit後才發現可能因為每次環境、機器不同或是重灌系統後一些原因,造成commit上的email卻不相同實在很困擾。

在網路上找到好多資訊,終於找到一個很正式的教學文件,然而這是從Github help上找到的Changing author info,想看原文的直接點入,下面總結一下做法:

  • 重新Clone一份帶有bare參數的完整檔案
git clone --bare https://github.com/user/repo.git
cd repo.git

  • 製作相關的shell script

下面內容存成git-author-rewrite.sh,並且變更OLD_EMAILCORRECT_NAMECORRECT_EMAIL

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="要變更的email"
CORRECT_NAME="變更後的名字"
CORRECT_EMAIL="變更後的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

此script會找到你要變更的email並且取代成你設定的,將檔案存檔後將屬性設成可執行:

chmod +x git-author-rewrite.sh

  • 變更author資訊

到console後切換到你clone好的repository目錄,並且執行剛存好的git-author-rewrite.sh會進行變更:

osx-prj:001_iOS danny$
/Users/danny/Documents/Workspace-Public/git-author-rewrite.sh

變更完成後會看到像下面的過程:

Rewrite 41786fb21e26347282e35f0fb077cdc9051e5e16 (30/30)
Ref 'refs/heads/master' was rewritten

這代表你完成變更。

  • 重新Push變更完成的repository

以上變更完成後要來強制將現有變更的資訊push到原先的repository

git push --force --tags origin 'refs/heads/*'

完成後你就可以刪除之前clone下來的repository暫存。