我在 Git 中有一个项目,它有几个子模块,我需要下载这些子模块和可用的文件才能使用主项目,并且为了使子模块工作,我需要它们自己的子模块可用等等。为了进行设置,我使用递归地初始化子模块git submodule update --init --recursive
.
但是,我注意到我的许多子模块都具有共享依赖项,在伪代码中看起来像这样(alpha -> beta
代表着alpha
有子模块beta
)
my project -> submodule a -> submodule m
-> submodule b -> submodule m
-> submodule n -> submodule x
-> submodule c -> submodule x
我的问题是:是否有任何方法可以仅使用 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 new-workdir http://git.kernel.org/?p=git/git.git;a=blob;f=contrib/workdir/git-new-workdir;hb=HEAD(来自 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 目录进行符号链接;值得注意的是没有符号链接的是HEAD
;这两个目录可以检出不同的内容,但共享相同的引用和对象。
从这里开始,你应该表现得很好。当你运行一个git submodule
命令,它只是进入子模块并在那里运行适当的命令,这一切都会按预期工作。
对于像这样的符号链接存储库,您通常需要注意的一件事是它们共享同一组分支,因此如果它们都签出了相同的分支,并且您在其中一个中提交了它,则另一个将变得不可用同步。不过,对于子模块来说,这通常不会成为问题,因为除非您干预,否则它们本质上始终处于分离的 HEAD 状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)