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

我有我的第一个Git子模块经验。

我有一些项目依赖于同一个子项目。 我保持这些项目同步,所以我使用“子模块分支”功能(例如, git submodule add -b master [URL] )。

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

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显然会看到它是一个符号链接,而不是跟随目录。

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


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

是的,Git会看到这样的变化,因为该子模块在父回购中被声明为索引中特殊条目

制作符号链接可以用另一种类型的文件替换该特殊条目。

你可以做的就是尝试使用GIT_WORK_TREE (例如,在钩子中包含git checkout中的子模块给GIT_WORK_TREE )。

但更简单的解决方案是:

  • 保持你的子模块正确的位置。
  • 将该子模块回购的另一个克隆添加到您想要的地方( /path/to/sub )。
  • 使用git --work-tree=/path/to/sub状态从您父级回购站的重复子模块文件夹中检测原始子模块文件夹中的任何更改。

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

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

    我找不到有关这种方法的很多信息,但看到它在这个类似的问题中列出。


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

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

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

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

    所以工作风格是从不提交子模块/类型转换。 只要你愿意跟踪主分支,克隆项目的人仍然会得到正确的结果。 同时,您可以使用磁盘上的单个存储库。

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

    链接地址: http://www.djcxy.com/p/92273.html

    上一篇: How to use submodules publicly, but symlinks to a single clone locally?

    下一篇: GitHub include from another repository