Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Git复制子模块_Git_Git Submodules - Fatal编程技术网

使用Git复制子模块

使用Git复制子模块,git,git-submodules,Git,Git Submodules,我有一个Git项目,有几个子模块,我需要下载这些子模块和可用的文件,以便使用主项目,为了让子模块工作,我需要它们自己的子模块可用等等。所以为了设置它,我使用git submodule update--init--recursive递归初始化子模块 然而,我注意到我的许多子模块都有共享的依赖项,在伪代码中看起来像这样(alpha->beta表示alpha有子模块beta) 我的问题是:在每个子模块都有(至少一份)文件的情况下,是否有任何方法可以避免仅使用git的重复 我可以想象一个使用符号链接的解

我有一个Git项目,有几个子模块,我需要下载这些子模块和可用的文件,以便使用主项目,为了让子模块工作,我需要它们自己的子模块可用等等。所以为了设置它,我使用
git submodule update--init--recursive
递归初始化子模块

然而,我注意到我的许多子模块都有共享的依赖项,在伪代码中看起来像这样(
alpha->beta
表示
alpha
有子模块
beta

我的问题是:在每个子模块都有(至少一份)文件的情况下,是否有任何方法可以避免仅使用git的重复

我可以想象一个使用符号链接的解决方案,但是如果git为我处理这个问题,那就更好了,我不确定自己添加符号链接是否会在更新子模块时引起问题

理想情况下,我希望将其简化为:

my project -> submodule a -> symlink(submodule m)
           -> submodule b -> symlink(submodule m)
                          -> symlink(submodule n)
           -> submodule c -> symlink(submodule x)
           -> submodule m
           -> submodule n -> symlink(submodule x)
           -> submodule x

提前感谢您的建议

这不是git内置的,但是你可以像你说的那样使用符号链接。您可能想看看(从git的contrib目录),它基本上就是这样做的。它不知道与子模块有什么关系,但子模块不知道它是子模块——父回购方知道这些东西。我还没有试过这个,但我很确定你可以用这样的方式:

# remove the target first (new-workdir will refuse to overwrite)
rm -rf submodule_b/submodule_m

#               (original repo)         (symlinked repo)
git new-workdir submodule_a/submodule_m submodule_b/submodule_m
它的工作原理是对所有.git目录进行符号链接;值得注意的是,没有符号链接的是
;这两个目录可以签出不同的内容,但共享相同的引用和对象

从这里你应该很好。当您在超级模块中运行
git子模块
命令时,它只会进入子模块并在那里运行适当的命令,所有这些命令都会按预期工作


对于像这样的符号链接回购,您通常需要注意的一点是,它们共享同一组分支,因此如果它们都签出了同一个分支,并且您在其中一个分支中进行了承诺,那么另一个分支将变得不同步。对于子模块,这通常不会成为问题,因为除非您进行干预,否则它们基本上始终处于分离的头部状态。

git new workdir
可能不是这里讨论的好解决方案:

在git 1.7.10下,它对我不起作用

我已经使用硬链接为我的用例解决了它。我正在运行OS X,文件系统允许创建指向目录的硬链接:

现在我可以硬链接子模块目录,git可以透明地处理它们。硬链接还有一个很好的特性,即所有子模块都完全镜像,包括HEAD,这是我在本例中更喜欢的行为

好的,我们的想法是有一个“主”子模块repo,并将所有“从”副本硬链接回它。这将使它们彼此无法区分并完全同步

注意事项

1) 只要.git中的相对路径起作用,这就可以正常工作。换句话说,您只能硬链接目录树中位于同一目录级别的子模块。这是我的案子。我假设您可以通过使用硬链接任务修改.git文件来轻松修复它。注意:在Git1.7.10之前,这应该没有问题,因为以前子模块的.git是一个自包含的目录,而不仅仅是指向其他地方的明文.git文件

2) 硬链接可能会引入一些不兼容。例如,TimeMachine会感到困惑,因为它在内部使用硬链接进行版本控制。确保从TimeMachine中排除项目目录

下面是我的rake任务执行此任务的示例:

问题不完全相同,但极为相似:
# remove the target first (new-workdir will refuse to overwrite)
rm -rf submodule_b/submodule_m

#               (original repo)         (symlinked repo)
git new-workdir submodule_a/submodule_m submodule_b/submodule_m