【发布时间】:2021-02-09 13:19:57
【问题描述】:
我在当前项目中犯了一个可怕的错误。 当我创建我的 java 项目时,我使用了错误的子包。
最好的情况是让我在第一次提交时重命名包,并将所有后续提交更改为正确的包名。
原因是我在一篇科学论文中引用了提交和包。现在提交重命名将非常不幸。
有没有办法应用此更改传递,所以我不必手动编辑所有提交? 所有提交都已推送到远程。
我是唯一的作者,拥有所有的管理权限。我想保留提交历史 - 这意味着我不想压缩所有提交。如有必要,可以更改他们的身份。
编辑:
我对这两种方法都应用了所需的更改,并想总结一下以供将来参考。
通过git rebase -i 的变基方法对于许多提交来说非常乏味。
必须对所有文件和所有目录的所有提交应用必要的更改。
由于我的情况下提交的数量,我无法做到没有任何错误,导致一些压缩提交。
如果没有grep、find 或我的编辑器的能力,我是不会成功的。
答案https://stackoverflow.com/a/66122950/6783797 建议的命令git filter-branch 可靠地完成了这项工作。
要应用的更改是:
- 重命名目录
- 查找需要更改内容的文件
重命名目录:
JAVADIR="$PWD/path/to/parent/package"
if [ -d "$JAVADIR/wrong" ]; then
mv "$JAVADIR/wrong" "$JAVADIR/right"
fi
为了找到合适的文件,我从接受的答案中传送了find 和sed -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