用重写存储库的历史记录后git filter-branch
,所有SHA都会更改。
现在,如果该存储库(我们称之为X
)用作另一个存储库(我们称之为Y
)中的git子模块,我们就会遇到问题。
实际上,基于该子模块中提交的SHAY
知道X
要加载哪个版本的子模块。由于X
现在所有的SHA都已更改,因此Y
指向不再存在的SHA。
有没有办法重写历史记录Y
,使其指向子模块的新提交SHA X
(当前和过去的提交)?
我猜想,鉴于旧的SHA和新的SHA之间存在对应关系,从原则上讲这是可能的,但是我担心它会涉及讨厌的bash脚本。
有什么容易的吗?
但恐怕会涉及讨厌的bash脚本。
恐怕是的。
有什么容易的吗?
从来没听说过。
以下是该脚本工作所需的一些线索(不是完整的脚本):
如果您仍然有权访问重写的存储库,则其原始历史记录(在过滤分支之前)将保留在中.git/refs/original
。
这意味着您可以循环使用该旧历史记录SHA1:
git -C /path/to/rewritten/repo for-each-ref --format="%(refname)" refs/original
如果更改仅限于一个分支,则可以轻松地将新的SHA1与旧的SHA1匹配(第一个旧的SHA1匹配重写的分支的第一个提交,第二个旧的与匹配的分支,依此类推)
如果不是,则必须寻找转速才能找到匹配项(相同的日期,合理的提交消息)
git rev-list --all \
| while read commit
do
...
确保父仓库更新其对子模块的引用:
cd parent/repo
cd asubmodule
git fetch
这样,新的SHA1就可以使用了。
最后,你可以做一个过滤器分支父回购,寻找gitlink,在索引特殊项,老SHA1的配套之一。
对于每个匹配项,您都需要在子模块文件夹中检出新的SHA1,返回上一级到父存储库,然后添加并提交:这将记录一个新的gitlink SHA1。
cd parent/repo/asubmodule
git checkout <new SHA1>
cd ..
git add .
git commit -m "Record new SHA1 for asubmodule"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句