【发布时间】:2012-05-26 19:44:01
【问题描述】:
我有一个包含几个子模块的项目。其中许多是从 GitHub fork 克隆的,我为我的自定义模块添加了一个分支。典型的设置是这样的:
在本地文件夹中:MyProject1/Frameworks/SomeAmazingRepo/
$ git branch -vva
*my-fork 123456 [my-fork/my-fork] Latest commit msg from fork
master abcdef [origin/master] Latest commit msg from original repo
remotes/my-fork/my-fork 123456 [my-fork/my-fork] Latest commit msg from fork
remotes/my-fork/master abcdef [origin/master] Latest commit msg from original repo
remotes/origin/HEAD -> origin/master
remotes/origin/master abcdef [origin/master] Latest commit msg from original repo
$ git remote -v
my-fork git@github.com:MyUser/SomeAmazingRepo.git (fetch)
my-fork git@github.com:MyUser/SomeAmazingRepo.git (push)
origin git://github.com/OriginalOwner/SomeAmazingRepo.git (fetch)
origin git://github.com/OriginalOwner/SomeAmazingRepo.git (push)
我 git clone --recursive 我的项目开始了一个新的衍生项目,当它开始递归时,它吐出一个错误,声称它找不到这些存储库的存储提交。经检查,似乎尚未添加遥控器,并且分支在 master 中保留(空)...
在本地文件夹中:MyProject2/Frameworks/SomeAmazingRepo/
$ git branch -vva
*master abcdef [origin/master] Latest commit msg from original repo
remotes/origin/HEAD -> origin/master
remotes/origin/master abcdef [origin/master] Latest commit msg from original repo
$ git remote -v
origin git://github.com/OriginalOwner/SomeAmazingRepo.git (fetch)
origin git://github.com/OriginalOwner/SomeAmazingRepo.git (push)
唯一的补救办法是手动将遥控器添加到所有存储库(非常乏味)。
在上面有两个跟踪分支但只有一个远程(origin => my github fork)的情况下存在类似的问题。在这种情况下,它会找到提交并将其签出,但无法重新创建跟踪分支,留下一个“悬空”提交......非常可怕,因为它没有警告你!
如何克隆我的项目,以便它可靠地重新创建子模块的远程和分支?
【问题讨论】:
-
你不能先确保所有 trackinf 分支都到位,首先是你的父 repo,然后通过
git submodule foreach,对于每个子模块,使用单行 like this one。 -
“trackinf 分支”是什么意思?此外,我不一定希望所有遥控器都作为分支检出。问题是
git clone --recursive根本没有重新创建子模块的(非原始)遥控器。我觉得我在这里遗漏了一些细微差别,但我不能完全指出它...... -
对不起,这是一个错字:“跟踪分支”(stackoverflow.com/questions/4693588/…)。显然不是你所缺少的。
-
实际上,我在最后简要提到的第二种情况是,源代码库中的子模块只有一个远程主模块(可以很好地克隆),但已签出跟踪分支。在这种情况下,
git clone--recursive将 HEAD 设置为分支的提交(它成功找到,因为它是 remote=origin 的一部分)但未能重新创建分支本身,这意味着它是悬空的。也许这是一个不同的问题,但我想我的问题只是“git clone --recursive 坏了还是只是我?!?”或“为什么使用子模块进行克隆如此不可靠,我该如何解决?” -
好的,关于“不可靠性”,我想我有一个很好的解释。请参阅下面我答案的最后一部分。
标签: git git-submodules git-clone cloning git-remote