【问题标题】:git: change one line in file for the complete historygit:更改文件中的一行以获得完整的历史记录
【发布时间】:2011-08-25 17:52:28
【问题描述】:

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

四处搜索我发现了这个解决方案:插入一个空提交作为初始提交(在此处描述:Insert a commit before the root commit in Git?),对其进行变基,然后通过修改编辑旧的第一个提交。不幸的是,在 rebase 期间会出现许多残酷的合并冲突(如此处所述:git: solving conflicts caused by rebase)。

有没有其他方法可以解决我的问题,还是必须手动修改和编辑所有冲突?

提前致谢:)

【问题讨论】:

  • 如果你只是改变一行,合并冲突应该很小。
  • @Clueless:变基时确实会出现冲突,这些是我过去解决的冲突
  • @Karl Bielefeldt:我问的是删除/替换这一行,而不是完整的文件
  • @TiBo - 现在为时已晚,但这就是 rerere 的目的。

标签: git commit git-amend


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我不知道-q 选项是否能做到这一点。您可能必须将它包装在一个 shell if-then 中,例如 if [ -e file ]; then sed...; fi
  • 如果你知道引入错误的commit,你可以git filter-branch --tree-filter 'sed -i "/sensitive information/ d" filename' <commit>..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 "skipping file"' -- --all
  • 我必须在filter-branch 命令上使用--force,否则更改似乎不适用。 GitHub recommends 也是。
【解决方案2】:

我做了这个命令,当文件不存在时不会出错:

 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 认为有一个失败。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    你可以看看git filter-branch

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

    【讨论】:

    • 我找到了一个删除完整文件的解决方案,但不能更改其中的一行。可以举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 2022-08-24
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多