46

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

环顾四周,我找到了这个解决方案:插入一个空提交作为初始提交(在此处描述:在 Git 中的根提交之前插入一个提交?),对其进行变基,然后通过修改编辑旧的第一个提交。不幸的是,在变基期间会出现许多残酷的合并冲突(如此处所述:git:解决由变基引起的冲突)。

有没有不同的方法来解决我的问题,还是必须手动修改和编辑所有冲突?

提前致谢 :)

4

4 回答 4

53

这是一个命令,它将从所有分支的文件历史记录中删除有问题的行:

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

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

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

注意:最好有备份,然后sed先自行尝试脚本以确保它正在执行您想要的操作,因为在很长的历史上运行可能需要相当长的时间。

于 2011-08-25T22:39:45.283 回答
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
于 2016-06-30T21:37:41.657 回答
4

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

 git filter-branch --tree-filter "test -f \"$filename\" && sed -i \"s/$filter//g\" \"$filename\" || echo \"skipping $filename\"" -- --all
于 2018-05-03T15:23:31.457 回答
1

你可以看看git filter-branch

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

于 2011-08-25T18:14:03.957 回答