如何公开使用子模块,但是在本地使用符号链接到单个克隆?

时间:2014-01-12 16:57:54

标签: git symlink git-submodules

我有第一个Git Submodule体验。

我有一些项目依赖于同一个子项目。我保持这些项目同步,因此我使用"submodule branch" feature(例如git submodule add -b master [URL])。

虽然我希望公共GitHub存储库传达子模块关系,但在我自己的工作流程中,我真的只想在我的磁盘上有一个共享代码库的克隆。我想我可以设置子模块,然后用符号链接做一个切换器。但是当我这样做时,我明白了:

On branch master
Changes not staged for commit:
 (use "git add <file>..." to update what will be committed)
 (use "git checkout -- <file>..." to discard changes in working directory)

    typechange: draem

所以Git显然认为它是一个符号链接,而不是跟随目录。

是否有任何工作流程我可以使用子模块,但实际上只有一个克隆在我的本地文件系统上?

5 个答案:

答案 0 :(得分:5)

您可以绑定装载子模块的其他目录

sudo mount --bind /path/to/main/repo relative/path/to/submodule

我无法找到有关此方法的更多信息,但在this中列出了类似的问题。

答案 1 :(得分:2)

(欣赏其他建议,但回答我已经决定做的事情,因为这是最简单的。)

将您计划共享的子模块的克隆放在他们自己的目录中。

然后在使用项目中设置您喜欢的方式,每个项目都有自己的克隆您计划共享的子模块。一旦项目以新用户正常获取子模块的方式设置,将子模块目录替换为您进行编辑的单个本地实例的共享符号链接,并将它们添加到.gitignore。

(而不是仅删除基于子模块的目录,您可能希望将它们重命名。然后您可以将它们移回原位并在必要时将它们拉出来。)

所以工作方式就是永远不要提交子模块/ typechange。只要您愿意始终跟踪主分支,克隆项目的人仍然会得到正确的结果。同时,您可以使用磁盘上的单个存储库。

对于处于更高阶段的项目,@ VonC可能有正确的答案......不要骗Git,检查适当状态的子模块,并使用触发器来管理更新。

答案 2 :(得分:1)

  

所以Git显然认为它是一个符号链接,而不是跟随目录。

是的,Git会看到这样的变化,因为该子模块在父代表中声明为special entry中的 the index

创建符号链接将用另一种类型的文件替换该特殊条目。

所做的是尝试使用GIT_WORK_TREE(如“Including submodules in git checkout to GIT_WORK_TREE in hook”)。

但更简单的解决方案是:

  • 将您的子模块保持在原位。
  • 在您想要的地方添加该子模块仓库的另一个克隆(/path/to/sub)。
  • 检测来自父回购中重复子模块文件夹中原始子模块文件夹的git --work-tree=/path/to/sub状态的任何更改。

答案 3 :(得分:0)

我个人不建议将不同项目的子模块指向相同的代码。如果来自子模块的代码真的很大,那么它可能是一个参数,但在大多数情况下我不会这样做。

这也可以是好的,因为你可以在你的一个项目的子模块中开发而不影响其他项目。

答案 4 :(得分:0)

理论上,您也可以编辑main-project/src/submoduleA/.git。这将是一个包含以下内容的文本文件:

.git/modules/src/submoduleA

如果您将该路径更改为类似以下内容,也许git不会在意:

.git/../../submoduleA

我不确定git是否允许这样做,或者某些git版本是否会因为其他版本起作用而阻塞。由于无法通过git跟踪此编辑,因此我什至不打算尝试。

也许git允许子模块作为同级目录...让我们测试一下:

clientA ➤ git submodule add https://github.com/myco/utils ../utils
The following path is ignored by one of your .gitignore files:
../utils
Use -f if you really want to add it.
clientA ➤ git submodule add -f https://github.com/myco/utils ../utils
fatal: ../utils: '../utils' is outside repository
'../utils' is not a valid submodule name

即使是傻瓜git,我也拥有最新的Mac OS(2.24.1)

git submodule add -f https://github.com/myco/utils src/../../utils
fatal: ../utils: '../utils' is outside repository
'../utils' is not a valid submodule name

符号链接是一个文件。子模块src/submoduleA必须是包含如上所述的.git文本文件的文件夹。