当我启动我的git repo时,我提交了一些文件作为初始提交。现在,很多提交后来,我注意到我在这些文件中包含了一条信息,其中包含我不想发布的信息(与其他代码不同)。所以我想删除/更改这一行并保留代码的其余部分。
搜索我找到了这个解决方案:插入一个空提交作为初始提交(在此描述:Insert a commit before the root commit in Git?),对其进行rebase,然后通过修改编辑旧的第一次提交。不幸的是,在rebase期间出现了许多残酷的合并冲突(如下所述:git: solving conflicts caused by rebase)。
有没有不同的方法可以解决我的问题,或者必须手动变基和编辑所有冲突?
提前致谢:)
答案 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