以下是我用来重写多个父存储库中引用的子模块历史记录的脚本。这在Windows环境中以Git bash运行。
#!/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 ,以便我可以在父存储库中更新相同的引用。有办法吗?我确实看过Repository with submodules after rewriting history of submodule,但它并没有真正起作用,因为我更新原始参考文件以确保我删除的文件不会被任何机会重新包装。我使用git相对较新,所以任何指导都会非常感激。
修改:
按照接受的答案(由@torek)的评论部分中提到的步骤为我工作。
答案 0 :(得分:0)
没有好办法(至少使用git filter-branch
和现有的Git工具 - BFG会留下所需的地图文件,但仍然需要构建一些东西)。
当git filter-branch
个副本提交时,它会将每个新提交的哈希放入一个"映射文件" (将旧ID和新ID配对 - 实际上是现有实现中的一个目录,虽然这在大型过滤器中表现很差,因此有一天可能会被更改),因此可以从原始提交哈希转换为重写提交哈希。这就是它提供the git filter-branch
documentation引用的map
函数的方式:
map 功能可以使用"原始sha1 id"参数并输出一个"重写的sha1 id"如果提交已经被重写,那么"原来的sha1 id"除此以外;如果您的提交过滤器发出多次提交, map 函数可以在单独的行上返回几个ID。
不幸的是,当git filter-branch
完成并清理时,删除映射表,而不是将其转换为有用的数据库。如果您拥有带有映射的数据库,则可以将其用于任何外部项(" gitlink"其他存储库,测试框架或您可能保存它们的任何其他位置的条目)。没有地图,没有好办法处理这个问题。超级项目说,例如,"使用提交1234567"但重写的子模块存储库中不再存在该提交。新提交的ID 将在地图中,但没有地图。