Git 重写子模块历史记录后具有子模块的存储库
使用Git 重写子模块历史记录后具有子模块的存储库,git,git-submodules,Git,Git Submodules,使用git filter branch重写存储库的历史记录后,所有SHA都会更改 现在,如果该存储库(我们称之为X)被用作另一个存储库(我们称之为Y)中的git子模块,我们就有问题了。 实际上,Y知道根据子模块中提交的SHA加载子模块X的哪个版本。由于X中的所有SHA现在都已更改,Y指向不再存在的SHA 是否有方法重写Y的历史记录,使其指向子模块X的新提交SHA(当前提交和过去提交) 我想,考虑到旧SHA和新SHA之间的通信,这在原则上是可能的,但我担心这会涉及令人讨厌的bash脚本。 还有更简
git filter branch
重写存储库的历史记录后,所有SHA都会更改
现在,如果该存储库(我们称之为X
)被用作另一个存储库(我们称之为Y
)中的git子模块,我们就有问题了。实际上,
Y
知道根据子模块中提交的SHA加载子模块X
的哪个版本。由于X
中的所有SHA现在都已更改,Y
指向不再存在的SHA
是否有方法重写Y
的历史记录,使其指向子模块X
的新提交SHA(当前提交和过去提交)
我想,考虑到旧SHA和新SHA之间的通信,这在原则上是可能的,但我担心这会涉及令人讨厌的bash脚本。还有更简单的吗 但我担心这会涉及到令人讨厌的bash脚本 恐怕是的 还有更简单的吗 据我所知不是这样。
以下是一些提示(不是一个完整的脚本),您需要这些提示才能使脚本正常工作: 如果您仍然可以访问重写的回购,其原始历史记录(在过滤器分支之前)将保存在
.git/refs/original
中
这意味着您可以循环查找旧的历史记录SHA1:
git -C /path/to/rewritten/repo for-each-ref --format="%(refname)" refs/original
如果更改仅限于一个分支,则可以轻松地将新SHA1与旧SHA1进行匹配(第一个旧SHA1与重写的分支的第一次提交相匹配,第二个旧SHA1……依此类推)
如果没有,则必须查找revs以找到匹配项(相同日期,sane commit消息)
确保父repo更新其子模块的引用:
cd parent/repo
cd asubmodule
git fetch
这样,新的SHA1就可以使用了
最后,您可以在父回购中执行筛选分支,查找与旧SHA1之一匹配的
对于每个匹配,您在子模块文件夹中签出新的SHA1,返回到父repo的一个级别,添加并提交:这将记录一个新的gitlink SHA1
cd parent/repo/asubmodule
git checkout <new SHA1>
cd ..
git add .
git commit -m "Record new SHA1 for asubmodule"
cd父级/repo/asubmodule
git签出
光盘
git添加。
git提交-m“为asubmodule记录新的SHA1”
cd parent/repo/asubmodule
git checkout <new SHA1>
cd ..
git add .
git commit -m "Record new SHA1 for asubmodule"