2012-11-25 80 views
7

我一直在研究git存儲庫並進行了一些提交。我一直在使用的文件塊在我的PHP文件,包括我的私人電子郵件地址,像這樣:更改Git歷史記錄中的電子郵件地址

/** 
* Bla bla bla. 
* 
* @author:  Nic <[email protected]> 
*/ 

現在我已經創建了一個新的電子郵件地址和更新的文檔塊,用新的替換舊的地址。但是這個更改只適用於我更改文檔之後的提交。

如何從git的歷史記錄中完全刪除舊的電子郵件地址,並用新地址替換所有實例?

我試過使用git filter-branch使用this blog post但沒有成功。我得到以下結果:

git filter-branch --tree-filter 'git ls-files -z "*.php" |xargs -0 perl -p -i -e "s#[email protected]#[email protected]#g"' -- --all 
Usage: git core\git-filter-branch [--env-filter <command>] [--tree-filter <command>] 
     [--index-filter <command>] [--parent-filter <command>] 
     [--msg-filter <command>] [--commit-filter <command>] 
     [--tag-name-filter <command>] [--subdirectory-filter <directory>] 
     [--original <namespace>] [-d <directory>] [-f | --force] 
     [<rev-list options>...] 

難道是電子郵件地址的特殊字符(@和。)被搞亂了正則表達式?除此之外,我不知道發生了什麼問題,任何幫助表示讚賞!

回答

3

另一種選擇是試圖過濾分支這樣:

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Nick NLD" ]; 
    then export [email protected]; 
    fi; git commit-tree "[email protected]"' 
+4

這隻會改變提交的作者,問題是尋找一種方法來更改文件內容中的電子郵件地址。 – qqx

+0

我已經找到了一個,但由於qqx說它改變了提交的郵件地址,而不是文件內的文檔塊。 –

+2

這適用於我的「=」,而不是「==」。 –

4

我不知道爲什麼你會得到一個用法消息。複製&粘貼你的命令有過濾器分支爲我運行。但是,它並沒有實際修改任何文件。這確實是因爲電子郵件地址中的@字符,導致perl將@email作爲列表變量並將其替換爲該列表中的(不存在的)內容。所以正則表達式正在尋找old-email.com

這可以通過使用\@代替perl命令中的@符號來解決。舊電子郵件地址中的.是正則表達式的特殊字符,但它與其他任何內容一致。在這種情況下,模式的其餘部分可能會很嚴格,以至於無關緊要,因此您可能並不需要避免這種情況。

+0

謝謝。我應該配置一些filter-branch來工作嗎?我是一個混帳noob,從來沒有使用過濾器分支。 –

相關問題