衍合的子模块
我有一个存储库A,具有库B作为子模块。 在一个理想的世界中,这是不可能发生的,但让我们说,由于某种原因,我希望做一个互动的底垫在仓库B.衍合的子模块
如果我这样做,并推动新的提交到远程(使用git push origin master --force
),下一次我会克隆存储库中,并拨打:
git submodule update --init
此命令就会失败,因为B的历史被改写,和git将无法找到指定的提交最初添加的子模块乙给A带。
我该怎么办?
删除子模块,然后重新添加?有更好的解决方案吗?
谢谢!
从你说的话,你强制更新回购B,但不更新回购A中的参考。所以你必须做的是更新它。
转到回购A中的根目录下,然后就可以使用下面的命令:
$cd /path/to/B
$git fetch // fetch the newest commit of B
$git checkout origin/master
$cd /path/to/A
$git diff // if all right, you will see some message like below
--- a/submodule/B
+++ b/submodule/B
@@ -1 +1 @@
-Subproject commit ac0569b524b9e47e86cb0a6c83e2e64c07fd878b
+Subproject commit 84f9ac384242ded082feac5eeccfd608e2bab918
$ git add .
$ git commit -m 'message'
$ git push // push the commit to A
这些之后,你可以克隆回购A和再试git submodule update --init
要更新A/.gitmodules以反映B中的更改。现在在B的强制推送过程中,如果您丢失了一些参考,则更新将会中断。
是什么原因做力推?
我要做一个力推因为B的历史被重写了,所以远程将不允许推动。我的问题是,当我将子模块添加到A时,git存储当前最新的提交sha1,因此下次我执行'$ git submodule update'时,它可以检出该提交。但是,由于B中不存在提交的rebase,所以git无法克隆/更新子模块。 – 2013-05-07 20:09:09
完美工作。谢谢! – 2013-05-08 08:23:54
对于回购A中的旧承诺呢?他们会不会参考rebase之前制作的回购B的提交? – bcause 2016-12-14 01:59:19