如何批量修改已推送至远程的所有Git提交中的Java子包名并保留提交历史
批量修改Git历史中的Java包名(保留完整提交历史)
刚好碰到过完全一样的场景!提交量多的时候git rebase -i确实会把人搞疯,我当时也是踩了坑之后转用git filter-branch搞定的,这玩意儿能自动遍历每一个提交完成批量修改,完美符合你要保留完整提交历史的需求。
具体操作步骤:
写一个目录重命名脚本
先创建一个脚本文件(比如rename_package_dir.sh),用来处理包目录的重命名:JAVADIR="$PWD/path/to/parent/package" if [ -d "$JAVADIR/wrong" ]; then mv "$JAVADIR/wrong" "$JAVADIR/right" fi把
path/to/parent/package换成你实际的父包路径,wrong是旧子包名,right是正确的子包名。执行
git filter-branch批量修改所有提交
这个命令会遍历每一个历史提交,先执行目录重命名,再批量替换所有Java和XML文件里的旧包名:git filter-branch --tree-filter "sh /path/to/rename_package_dir.sh; find . -type f \( -iname '*.java' -o -iname '*.xml' \) | xargs -r sed -i 's/wrong/right/g'"- 把
/path/to/rename_package_dir.sh换成你刚才创建的脚本的实际路径 - 把
wrong和right替换成对应的包名 - 如果还有其他需要修改包名的文件类型(比如
.properties),直接在find的条件里加-o -iname '*.properties'就行
- 把
推送到远程仓库
修改完历史之后,本地分支和远程分支肯定会出现分歧,因为你改写了历史。由于你是唯一作者且有管理权限,直接用强制推送即可:git push --force-with-lease用
--force-with-lease比直接--force更安全,能避免覆盖别人可能偷偷提交的内容(虽然你说自己是唯一作者,但好习惯还是要保持)。
重要提醒:
- 操作前一定要备份仓库!改写历史是不可逆的操作,备份一份原始仓库,万一出错能及时恢复。
- 如果提交数量非常多,
git filter-branch执行时间会有点长,耐心等它跑完就行,别中途中断。 - 之后所有基于旧历史的本地分支都需要重新拉取或者rebase到新的分支上。
内容的提问来源于stack exchange,提问作者Tomes
相关产品推荐
相关产品推荐

