Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git:在文件中更改一行以获得完整的历史记录_Git_Commit_Git Amend - Fatal编程技术网

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

git:在文件中更改一行以获得完整的历史记录,git,commit,git-amend,Git,Commit,Git Amend,当我开始我的git repo时,我提交了一些文件作为初始提交。现在,在许多提交之后,我注意到我在这些文件中包含了一行我不想发布的信息(与代码的其余部分不同)。因此,我想删除/更改这一行,并保留代码的其余部分 在四处搜索时,我发现了这个解决方案:插入一个空的提交作为初始提交(此处描述:),对其进行重基,然后通过修改编辑旧的第一次提交。不幸的是,许多残酷的合并冲突在重基过程中出现(如下所述:) 是否有不同的方法来解决我的问题,或者必须手动重新设置和编辑所有冲突 提前感谢:)您可以查看git过滤器分支

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

在四处搜索时,我发现了这个解决方案:插入一个空的提交作为初始提交(此处描述:),对其进行重基,然后通过修改编辑旧的第一次提交。不幸的是,许多残酷的合并冲突在重基过程中出现(如下所述:)

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


提前感谢:)

您可以查看
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认为出现了故障。