Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 重写子模块历史记录后具有子模块的存储库_Git_Git Submodules - Fatal编程技术网

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"