以下是我用来重写多个父存储库中引用的子模块的历史记录的脚本。这在Windows环境中运行在Git bash中。重新编写子模块的git历史记录后,更新对父存储库中子模块的引用
#!/bin/bash
cd submodule_repo
git filter-branch --index-filter 'git rm -q --cached --ignore-unmatch files_to_remove' \--tag-name-filter cat -- --all
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now
我需要的SHA一个旧提交的某种方式映射到新创建的SHA S,这样我就可以更新父库相同的参考。有没有办法做到这一点?我确实看过Repository with submodules after rewriting history of submodule,但这并不是真正的帮助,因为我正在更新原始参考文件,以确保我删除的文件不会被任何机会重新打包。我对使用git比较陌生,所以任何指导都会非常感激。
编辑:
继公认的答案(由@torek)的评论部分中提到的步骤为我工作。
谢谢@torek这是令人失望的:(应该有一个选项来保留或放弃地图一旦过滤器分支完成,将在这种情况下非常有用。任何解决方法,我可以用来手动创建地图? –
最简单的方法就是修改过滤分支代码,这是一个shell脚本,所以修改起来非常简单,只需找到删除临时目录的地方,然后让它对地图进行一些有用的操作即可保存。 – torek
已经有一段时间了,但现在我又回到了这个任务,所以我使用了'$ GIT_COMMIT'变量,如[这里]所述(https://stackoverflow.com/questions/14782906/how-do-i-get- ),并创建了地图作为filter-branch的一部分,它似乎正确地填充地图(所有我的修改提交在地图中注册)以及旧的提交。 –