git:在文件中更改一行以获得完整的历史记录
当我开始我的git repo时,我提交了一些文件作为初始提交。现在,在许多提交之后,我注意到我在这些文件中包含了一行我不想发布的信息(与代码的其余部分不同)。因此,我想删除/更改这一行,并保留代码的其余部分 在四处搜索时,我发现了这个解决方案:插入一个空的提交作为初始提交(此处描述:),对其进行重基,然后通过修改编辑旧的第一次提交。不幸的是,许多残酷的合并冲突在重基过程中出现(如下所述:) 是否有不同的方法来解决我的问题,或者必须手动重新设置和编辑所有冲突git:在文件中更改一行以获得完整的历史记录,git,commit,git-amend,Git,Commit,Git Amend,当我开始我的git repo时,我提交了一些文件作为初始提交。现在,在许多提交之后,我注意到我在这些文件中包含了一行我不想发布的信息(与代码的其余部分不同)。因此,我想删除/更改这一行,并保留代码的其余部分 在四处搜索时,我发现了这个解决方案:插入一个空的提交作为初始提交(此处描述:),对其进行重基,然后通过修改编辑旧的第一次提交。不幸的是,许多残酷的合并冲突在重基过程中出现(如下所述:) 是否有不同的方法来解决我的问题,或者必须手动重新设置和编辑所有冲突 提前感谢:)您可以查看git过滤器分支
提前感谢:)您可以查看
git过滤器分支
链接中的示例应该可以帮助您继续操作:以下是一个命令,该命令将从所有分支中的文件历史记录中删除有问题的行:
git filter-branch --tree-filter 'sed -i "/sensitive information/ d" filename' -- --all
这将签出每个修订,对其运行sed
命令,然后提交该修订
本例中的sed
命令匹配名为filename
的文件中包含模式敏感信息的任何行,并删除这些行
注意:如果您有一个备份,那么最好先尝试自己的sed
脚本,以确保它正在执行您想要的操作,因为它可能需要相当长的时间才能在一个较长的历史记录上运行。当文件不存在时,我发出的这个命令不会出错:
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
我的答案综合了所有的优点。它只替换给定的过滤器字符串而不是整行,如果在提交中找不到文件,它会很好地跳过。有很多转义的引语,但另一个答案有一些非常奇怪的引语,对我来说不起作用
git filter-branch --tree-filter "test -f \"$filename\" && sed -i \"s/$filter//g\" \"$filename\" || echo \"skipping $filename\"" -- --all
如果您只是更改一行,合并冲突应该非常小。@clauless的可能重复:重定基址时确实会出现冲突,这些冲突是我在past@Karl比勒费尔特:我是在问关于移除/替换这条线的问题,不是一个完整的问题file@TiBo-现在太晚了,我找到了一个解决方案,可以删除一个完整的文件,但不能更改其中的一行。能举个例子吗?我不知道-q
选项是否能做到这一点。您可能需要将其包装在shell if-then中,如if[-e file];然后塞德。。。;fi
如果您知道引入了提交错误,您可以git filter分支--tree filter“sed-i”/sensitive information/d“filename”…HEAD
在windows上,我一直收到一个错误“没有这样的文件或目录”。我最终发现,使用完整的文件路径作为文件名(例如:c:\filename.txt)并将其放在双引号中可以使其工作。我在macOS上使用了一个稍微修改的sed
command+args:git filter branch-f--tree filter'test-f yourfile.json&&sed-I”““s/oldText/newText/g”yourfile.json | echo“跳过文件”'--all
我必须在过滤器分支
命令上使用--force
,否则更改似乎不适用。我也是,对我很有用。我想我会注意到,万一其他人遇到这种情况——不要删除结尾处的echo“跳过文件”。否则您可能会得到错误“树过滤器失败”;由于最后一个返回码是非零的,git认为出现了故障。