我有第一个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显然认为它是一个符号链接,而不是跟随目录。
是否有任何工作流程我可以使用子模块,但实际上只有一个克隆在我的本地文件系统上?
答案 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文本文件的文件夹。