2011-08-25 68 views
29

當我開始使用git repo時,我提交了幾個文件作爲初始提交。現在,在稍後的許多提交中,我注意到我在這些文件中包含了一行我不想發佈的信息(與其他代碼不同)。所以我想刪除/更改這一行保持其餘的代碼。git:更改文件中的一行以獲得完整的歷史記錄

搜索我發現這個解決方案:插入一個空的提交作爲初始提交(在這裏描述:Insert a commit before the root commit in Git?),做一個rebase,然後通過修改編輯舊的第一次提交。不幸的是,在rebase期間出現了許多殘酷的合併衝突(如此處所述:git: solving conflicts caused by rebase)。

有沒有不同的方法來解決我的問題,還是必須重新編輯和手動編輯所有衝突?

感謝提前:)

提伯

+0

如果你只是改變一個行合併衝突應該是相當小的。 – Clueless

+0

可能的重複[如何從git的歷史中刪除敏感文件](http://stackoverflow.com/questions/872565/how-do-i-remove-sensitive-files-from-gits-history) –

+0

@無色:衝突確實出現在重新貸款時,這些衝突是我在過去解決的衝突 – tbolender

回答

38

這裏有一個命令,將刪除文件歷史中的所有分支中的違規行:

git filter-branch --tree-filter 'sed -i "/sensitive information/ d" filename' -- --all 

檢查每個修訂版本,在其上運行sed命令,然後提交該修訂版本。

在這種情況下,sed命令與文件filename中包含模式sensitive information的任何行匹配,並刪除這些行。

注意:如果您有備份,並且首先嚐試使用sed腳本以確保它正在做您想做的事情,這很不錯,因爲長時間運行需要相當長的時間。

+0

是否有可能忽略sed錯誤(例如,當一個修訂中不存在文件時)? – tbolender

+3

我不知道'-q'選項是否可以。你可能必須把它包裝在一個shell中,然後像'if [-e file];然後sed ...; fi' –

+0

使用shell如果爲我工作:) – tbolender

4

我做了這個命令不報錯了,當一個文件不存在:

filename=./path/to/your/filename 
filter=your_regex_here 

git filter-branch --tree-filter 'test -f $filename && sed -i.bak "/$filter/d" $filename || echo 「skipping file「' -- --all 
相關問題