我有一个项目,我有兴趣将部分分解为开源。我已经在“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),但这不是特别理想的克隆情况。
还有其他建议吗?
答案 0 :(得分:18)
你可以做你想做的事情,但是你需要克隆它们的人one
,two
和three
- 这通常不是这种情况“随机”开发存储库。
如果你设置了这个,你需要非常小心,不要删除“你的”存储库(或使其无法访问)因为它不仅仅是“你的”:它将是 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 init
,one
和two
可远程访问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)
Chris的answer不假设“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)。