iai*_*ton 21 git git-submodules
我在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
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有办法只使用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
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的任何建议!
这不是内置于git中,但你可以像你说的那样使用符号链接.你可能想看一下git new-workdir(来自git的contrib目录),基本上就是这个.它不知道与子模块有什么关系,但子模块不知道它是一个子模块 - 它是知道这些东西的父repo.我没有试过这个,但我相当肯定你可以使用这样的东西:
# 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
Run Code Online (Sandbox Code Playgroud)
它通过符号链接基本上所有的.git目录来工作; 没有符号链接的值得注意的事情是HEAD; 这两个目录可以签出不同的东西,但共享相同的引用和对象.
从这里你应该是好的.当你git submodule在超级模块中运行一个命令时,它只是进入子模块并在那里运行适当的命令,这些命令都将按预期工作.
你通常需要注意的一点就是这样的symlinked repos就是它们共享同一组分支,所以如果它们都签出了相同的分支,并且你在一个分支中承诺它,那么另一个将变为同步.对于子模块,这通常不会成为问题,因为除非你介入,否则它们基本上总是处于分离的HEAD状态.
git-new-workdir可能不是这里讨论的好的解决方案:
http://comments.gmane.org/gmane.comp.version-control.git/196019
它在 git 1.7.10 下对我不起作用。
我已经使用硬链接解决了我的用例。我正在运行 OS X,文件系统允许创建目录的硬链接: https: //github.com/darwin/hlink
现在我可以硬链接子模块目录,并且 git 透明地对待它们。硬链接还有一个很好的特性,即所有子模块都完全镜像,包括 HEAD,在我的例子中这是我更喜欢的行为。
好吧,我们的想法是拥有一个“主”子模块存储库,并将所有“从”副本硬链接回它。这将使它们彼此无法区分并且完全同步。
注意事项:
1)只要 .git 中的相对路径有效,这就可以正常工作。换句话说,您只能硬链接目录树中同一目录级别的子模块。这就是我的情况。我假设您可以通过使用硬链接任务修改 .gitfiles 来轻松修复它。注意:在 git 1.7.10 之前这应该不成问题,因为以前子模块的 .git 是一个独立的目录,而不仅仅是指向其他地方的纯文本 .git 文件。
2) 硬链接可能会引入一些不兼容性。例如,TimeMachine 会感到困惑,因为它在内部使用硬链接进行版本控制。确保从 TimeMachine 中排除项目目录。
这是我的 rake 任务完成这项工作的示例: https://github.com/binaryage/site/blob/3ef664693cafc972d05c57a64c41e89b1c947bfc/rakefile#L94-115
| 归档时间: |
|
| 查看次数: |
2737 次 |
| 最近记录: |