没有遥控器的嵌套git存储库(没有遥控器的a.k.a. git子模块)

时间:2011-05-23 17:55:46

标签: git git-submodules

我有一个项目,我有兴趣将部分分解为开源。我已经在“main / one”,“main / two”,“main / three”中设置了一个“main”git存储库(例如,在“main”目录中)和子存储库。我想通过进入“主要”并做

git add one
git add two
git add three

(注意缺少尾部斜杠),我会设置子库和子存储库,并且很好。

但是,如Git - how to track untracked content?所述,这只会创建gitlinks而不是真正的子模块。

不幸的是,这个答案没有用,因为它假设某个地方有一个“主”存储库其他代表“main / one”,“main / two”和“main / three” ”。我希望这些子回购主存储库。我正在考虑假子模块(根据Git fake submodules),但这不是特别理想的克隆情况。

还有其他建议吗?

3 个答案:

答案 0 :(得分:18)

你可以做你想做的事情,但是你需要克隆它们的人onetwothree - 这通常不是这种情况“随机”开发存储库。

如果你设置了这个,你需要非常小心,不要删除“你的”存储库(或使其无法访问)因为它不仅仅是“你的”:它将是 origin 在协作者的克隆中,它将作为“中央”/“上游”存储库(在.gitmodules中指定)。


如果所有协作者都是本地协作者(并且可以从存储库中读取),则可以将现有子存储库作为子模块添加,方法是将其本地路径作为URL提供:

git rm --cached one two three
git submodule add `pwd`/one
git submodule add `pwd`/two
git submodule add `pwd`/three

如果不是所有的协作者都在同一台计算机上工作,那么这可能无法正常工作(因为它会在.gitmodules中存储本地路径;非本地协作者必须在{{}}之后调整网址{1}})。

如果您的git submodule initonetwo可远程访问Git,则可以指定其有效的网址:

three

在这两种情况下,由于您已经有了一个子存储库,git rm --cached one two three git submodule add server:/path/to/your/main/one git submodule add server:/path/to/your/main/two git submodule add server:/path/to/your/main/three 将使用它而不是尝试从指定的路径/ URL进行克隆。

答案 1 :(得分:3)

Chrisanswer不假设“master”回购(master是Git中主分支的默认名称,而不是回购)

它在“parent”仓库中声明子模块,在您的情况下为“main”。

因此,您需要三个独立的回购“one”“two”和“three”设置其他地方,然后克隆并将其添加到您的“ main“repo as submodules:

# first remove the one directory previously added
git rm --cached one
# then declare the external one repo as a submodule in "main" repo)
git submodule add /path/to/one.git one

答案 2 :(得分:0)

我想到了将子模块的存储库完全放在超级项目的子目录中的想法。这样,整个项目只依赖于您设置的一个存储库/位置(基于Chris的答案)。

E.g。子模块one将作为其主存储库的位置server:/path/to/your/main/one(通过该目录中的git remote -v)。

这样,submodule功能(例如git submodule update --recursive)也指向正确的位置,因为该模块/存储库的URL指向./one(.gitmodules)。