git:在文件中更改一行以获取完整的历史记录

时间:2011-08-25 17:52:28

标签: git commit amend

当我启动我的git repo时,我提交了一些文件作为初始提交。现在,很多提交后来,我注意到我在这些文件中包含了一条信息,其中包含我不想发布的信息(与其他代码不同)。所以我想删除/更改这一行保留代码的其余部分

搜索我找到了这个解决方案:插入一个空提交作为初始提交(在此描述:Insert a commit before the root commit in Git?),对其进行rebase,然后通过修改编辑旧的第一次提交。不幸的是,在rebase期间出现了许多残酷的合并冲突(如下所述:git: solving conflicts caused by rebase)。

有没有不同的方法可以解决我的问题,或者必须手动变基和编辑所有冲突?

提前致谢:)

4 个答案:

答案 0 :(得分:47)

这是一个命令,可以删除所有分支中文件历史记录中的违规行:

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

这将检出每个修订版本,在其上运行sed命令,然后提交该修订版本。

在这种情况下,sed命令匹配名为sensitive information的文件中包含模式filename的所有行,并删除这些行。

注意:如果您有备份,那就好了,首先尝试使用sed脚本,以确保它正在执行您想要的操作,因为它可能需要很长时间才能运行很长的历史记录。 / p>

答案 1 :(得分:8)

我创建了一个在文件不存在时不会出错的命令:

 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

答案 2 :(得分:1)

您可以查看git filter-branch

链接中的示例可以帮助您:http://git-scm.com/docs/git-filter-branch

答案 3 :(得分:0)

我的答案结合了最好的一切。它取代了给定的过滤器字符串而不是整行,如果在提交中找不到该文件,它会很好地跳过它。有很多逃脱的引用,但另一个答案有非常奇怪的引用,这对我不起作用。

 git filter-branch --tree-filter "test -f \"$filename\" && sed -i \"s/$filter//g\" \"$filename\" || echo \"skipping $filename\"" -- --all