2010-12-20 63 views
98

我想在我的所有提交中更改我的名字,姓氏和電子郵件,這有可能嗎?我可以在以前的所有提交中更改我的姓名嗎?

+2

它是一個reprository只有你,幾個人或一個大的項目? – thejh 2010-12-20 21:06:58

+3

可能的重複[如何更改git中的提交作者?](http://stackoverflow.com/questions/750172/how-do-i-change-the-author-of-a-commit-in - git) – 2010-12-20 21:32:55

+0

可能的重複[如何重寫git倉庫中的提交者名稱?](http://stackoverflow.com/questions/1566809/how-do-i-rewrite-committer-names-in-a-git -repository) – 2011-02-28 21:10:31

回答

166

使用git-filter-branch

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Josh Lee" ]; 
    then export GIT_AUTHOR_NAME="Hobo Bob"; export [email protected]; 
    fi; git commit-tree "[email protected]"' 

這隻影響作者,而不是提交者(對於大多數提交將與作者相同)。如果要重寫這些變量,請設置GIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL變量。

關於重寫歷史的standard warning適用;只對歷史尚未分享。

+0

但在Windows上做什麼? – Joshua 2010-12-20 21:57:00

+3

如果你使用'msysgit',你仍然可以訪問'bash'。否則,我不知道。 – 2010-12-20 21:59:17

+1

@Joshua更新,因爲我忘了提交者的信息。 – 2010-12-21 16:00:26

2

只有當你沒有把你的提交推向世界時。其他每個人都有你的舊名稱在他們的回購,這是不可能的,你可以改變每個人的。

+0

是的,但在某些情況下,你別無選擇。我的情況我有一個錯誤的電子郵件地址配置在我的git配置(我可以看到「git config --global -l」)。因此,我沒有在我自己的Github倉庫中顯示提交活動(因爲電子郵件地址與Github中配置的電子郵件不匹配)!爲了解決這個問題,我使用http://stackoverflow.com/a/23564785/2474068(完美工作)的配方修復了我的本地提交,然後使用「git push -u -f origin master」將更改的提交推送到Github, (帶有強制標誌「-f」)。這違背了公認的做法,但我沒有選擇! – leo 2016-11-10 11:10:52

+1

是的,我的觀點是,除非他們接受你的推動力,否則該回購的任何分支都不會有這種變化。這將是具有挑戰性的,讓每一個叉更新:) – EnabrenTane 2016-11-10 22:01:55

31

如果沒有其他作者,你可以這樣做:

git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \ 
export [email protected]; git commit-tree "[email protected]"' 
+1

這不是重寫「提交者:」信息。 – user11153 2014-05-04 13:26:58

+1

它不打算重寫提交者信息。如果你想這樣做,請輸出GIT_COMMITTER_NAME和GIT_COMMITTER_EMAIL(請參閱接受的答案)。 – chronospoon 2014-11-03 17:59:57

45

要在所有選定提交改寫作者和commiter:

git filter-branch --commit-filter \ 
'if [ "$GIT_AUTHOR_NAME" = "OldAuthor Name" ]; then \ 
export GIT_AUTHOR_NAME="Author Name";\ 
export [email protected];\ 
export GIT_COMMITTER_NAME="Commmiter Name";\ 
export [email protected];\ 
fi;\ 
git commit-tree "[email protected]"' 
+1

但是如何將更改應用到遠程服務器? – vikyd 2017-05-25 07:56:48

+2

@Viky試試'git push --all origin --force' – user11153 2017-05-25 08:09:44

+2

它適合我!我使用的是GitLab,我必須在push命令之前解除分支。 – vikyd 2017-05-25 08:26:27

10

另存爲以下例如腳本~/.bin/git-replace-author和使用運行它,e.g:

git replace-author "John Ssmith" "John Smith" "[email protected]" 

不帶任何參數,它更新所有你的名字根據混帳配置使用您當前的電子郵件地址提交。

DEFAULT_NAME="$(git config user.name)" 
DEFAULT_EMAIL="$(git config user.email)" 
export OLD_NAME="${1:-$DEFAULT_NAME}" 
export NEW_NAME="${2:-$DEFAULT_NAME}" 
export NEW_EMAIL="${3:-$DEFAULT_EMAIL}" 

echo "Old:" $OLD_NAME "<*>" 
echo "New:" "$NEW_NAME <$NEW_EMAIL>" 
echo "To undo, use: git reset $(git rev-parse HEAD)" 

git filter-branch --env-filter \ 
'if [ "$GIT_AUTHOR_NAME" = "${OLD_NAME}" ]; then 
    export GIT_AUTHOR_NAME="${NEW_NAME}" 
    export GIT_AUTHOR_EMAIL="${NEW_EMAIL}" 
    export GIT_COMMITTER_NAME="${NEW_NAME}" 
    export GIT_COMMITTER_EMAIL="${NEW_EMAIL}" 
fi' 

Raw(下載)

+0

作爲一個簡短說明:'〜/ .bin /'需要位於用戶'$ PATH'中,並且該文件需要可執行,所以運行:'chmod + x〜/ .bin/git-replace-author'。 – 2018-02-20 14:09:57

相關問題