【问题标题】:Apply change to all commits将更改应用于所有提交
【发布时间】:2021-02-09 13:19:57
【问题描述】:

我在当前项目中犯了一个可怕的错误。 当我创建我的 java 项目时,我使用了错误的子包。

最好的情况是让我在第一次提交时重命名包,并将所有后续提交更改为正确的包名。

原因是我在一篇科学论文中引用了提交和包。现在提交重命名将非常不幸。

有没有办法应用此更改传递,所以我不必手动编辑所有提交? 所有提交都已推送到远程。

我是唯一的作者,拥有所有的管理权限。我想保留提交历史 - 这意味着我不想压缩所有提交。如有必要,可以更改他们的身份。

编辑:

我对这两种方法都应用了所需的更改,并想总结一下以供将来参考。

通过git rebase -i 的变基方法对于许多提交来说非常乏味。 必须对所有文件和所有目录的所有提交应用必要的更改。 由于我的情况下提交的数量,我无法做到没有任何错误,导致一些压缩提交。 如果没有grepfind 或我的编辑器的能力,我是不会成功的。

答案https://stackoverflow.com/a/66122950/6783797 建议的命令git filter-branch 可靠地完成了这项工作。 要应用的更改是:

  1. 重命名目录
  2. 查找需要更改内容的文件

重命名目录:

JAVADIR="$PWD/path/to/parent/package"
if [ -d "$JAVADIR/wrong" ]; then
  mv "$JAVADIR/wrong" "$JAVADIR/right"
fi

为了找到合适的文件,我从接受的答案中传送了findsed -i 's/wrong/right/g'。 将这些组装在一起给出了: git filter-branch --tree-filter "sh /path/to/rename_script.sh; find . -type f \( -iname '*.java' -o -iname '*.xml' \) | xargs -r sed -i 's/wrong/right/g'"

我最终得到的是一个分叉的分支,我想在我的遥控器上使用它。快速搜索给了我这个答案:https://stackoverflow.com/a/40201484/6783797

【问题讨论】:

  • 你应该考虑使用交互式变基,这篇博文可能会给你一些关于如何做到这一点的指导:thoughtbot.com/blog/…
  • 谢谢@andlrc。我需要更多指导。我应该恢复到初始提交,创建一个新分支,应用我的重命名,然后在 origin/master 之上重新设置?
  • "最好的情况是我能够 [...] 并且传递更改所有后续提交 [...]" 与 "I想要保留提交历史记录。” 修改某些内容将修改所有后续历史记录。但我想这就是重点,这就是为什么我发现你的最后一句话具有误导性。
  • 对不起我的英语,我指定了最后一句话。尽管@RomainValeri 你是对的

标签: git


【解决方案1】:

正如@WilliamPursell 建议的那样,在您的情况下,filter-branch 是最合适的命令。它是git提供的一个非常高性能和灵活的工具,但是要注意,如果使用不当会很危险。

首先,filter-branch 重写历史记录,如果需要,可以重写整个历史记录,并接受多个选项。在您的情况下,--tree-filter 因为您需要更改我猜的一个或多个文件的内容。旧的提交不会永远丢失,但它们仍然可以访问,因为旧的HEAD 仍然由refs/original/refs/heads/your_branch 指向。您可以使用 git log --all 查看旧提交。鉴于您独自参与该项目当然是一种优势,因此没有人会抱怨他们的历史或其中的一部分已被改写。

老实说,我不知道在filter-branch 命令之后创建的备份分支是永远保留在那里还是在某个时间后自动gced。我确信在删除该指针之前你不能再做一次filter-branch,除非你强制它-f

在所有这些警告之后,您可能会运行类似这样的操作:

git filter-branch --tree-filter "sed -i 's/import my.wrong.package/import my.right.package;/g' target_file"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2012-10-13
    • 2016-05-05
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多