没有遥控器的嵌套git存储库(也就是没有遥控器的git子模块)

Dav*_*lle 30 git git-submodules

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

git add one
git add two
git add three
Run Code Online (Sandbox Code Playgroud)

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

但是,正如Git中所述 - 如何跟踪未跟踪的内容?,这只会创建gitlinks而不是真正的子模块.

不幸的是,这个答案没有用,因为它假定在其他地方有"主要/一个","主要/两个"和"主要/三个" 的"主"存储库.我希望这些子仓库成为主存储库.我正在考虑假子模块(根据Git假子模块),但这对于克隆来说并不是特别理想的情况.

还有其他建议吗?

Chr*_*sen 19

你可以做你想做的,但你的one,twothree需要是谁就将需要克隆访问他们,这不是通常的"随机"的开发库的情况.

如果你设置此,你将需要非常小心,不要删除"您的"资源库(或使其不可访问),因为它不只是"你":这将是起源于你的合作者的克隆,它将作为服务"中央"/"上游"存储库(如中所述.gitmodules).


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

git rm --cached one two three
git submodule add `pwd`/one
git submodule add `pwd`/two
git submodule add `pwd`/three
Run Code Online (Sandbox Code Playgroud)

如果不是所有协作者都在同一台机器上工作,那么这可能无法正常工作(因为它将存储本地路径.gitmodules;非本地协作者必须在之后调整URL git submodule init).

如果您的one,, twothree远程Git可访问,那么您可以指定其有效的URL:

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
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,由于您已经有一个子存储库,因此git submodule add将使用它而不是尝试从指定的路径/ URL进行克隆.

  • @David:1)添加一个带有相对路径的子模块意味着`git submodule add`特殊的东西:将其解析为相对于包含存储库的*origin*remote.这就是为什么我在我的例子中使用`pwd`来获得绝对路径.2)是的,您的协作者可以在初始化子模块后始终编辑`.git/config`.如果您为子存储库建立了一个广泛使用的URL(或决定将裸克隆放在广泛可访问的位置),那么应该更新`.gitmodules`,以便克隆主存储库的未来协作者不必手动调整URL . (5认同)
  • TLDR:没有遥控器就不可能,除非所有协作者共享一台机器。 (2认同)
  • 请注意,对于最新版本的 git(对我来说是 v2.38.1),当尝试添加本地子模块路径时,默认情况下会阻止“文件”协议,并且使用上面的子模块命令将会出现错误,其效果为`克隆到“/tmp/repo1/sub”...致命:不允许传输“文件”致命:将“/tmp/repo2”克隆到子模块路径“/tmp/repo1/sub”失败。为了避免这种情况,需要使用 `-c` 选项来覆盖 `protocol.file.allow` 配置属性,例如 `git -c protocol.file.allow=always submodule add --name subrepo /tmp/repo2父仓库下的路径` (2认同)

Von*_*onC 6

Chris答案不假设为“ master”存储库(master是 Git 中主分支的默认名称,而不是存储库)。

它在“”存储库中声明子模块parent,在您的情况下将是“ main”。

因此,您需要三个独立的存储库“ one”“ two”和“ ”在其他地方three设置,然后将它们作为子模块克隆并添加到您的“”存储库中:main

# 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
Run Code Online (Sandbox Code Playgroud)