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

问题描述 投票:0回答:5

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

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

是否有不同的方法来解决我的问题,或者必须手动重新设置和编辑所有冲突?

提前致谢:)

git commit git-amend
5个回答
57
投票

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

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

这会检查每个修订,对其运行

sed
命令,然后提交该修订。

本例中的

sed
命令会匹配名为
sensitive information
的文件中包含模式
filename
的任何行,并删除这些行。

注意:如果您有备份,最好先单独尝试

sed
脚本,以确保它正在执行您想要的操作,因为在很长的历史记录上运行可能需要相当长的时间。


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

5
投票

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

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

2
投票

你可以看看

git filter-branch

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


0
投票

Git 历史记录可以通过

bfg
工具重写。

brew install bfg

echo anyword0 >> words.txt
echo anyword1 >> words.txt

bfg --replace-text words.txt .git

更多信息在这里: https://www.explainprogramming.com/git/deletion/

© www.soinside.com 2019 - 2024. All rights reserved.