2011-08-25 72 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 
相关问题