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

Hos*_*ork 23 git symlink git-submodules

我有我的第一个Git Submodule体验.

我有一些项目依赖于同一个子项目.我保持这些项目同步,所以我使用"子模块分支"功能(例如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
Run Code Online (Sandbox Code Playgroud)

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

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

Gil*_*lly 6

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

sudo mount --bind /path/to/main/repo relative/path/to/submodule
Run Code Online (Sandbox Code Playgroud)

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


Von*_*onC 4

因此,Git 显然看到了它是一个符号链接的事实,而不是跟踪到目录。

是的,Git 会看到这样的更改,因为该子模块在父存储库中声明为索引中的特殊条目

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

可以做的就是尝试使用GIT_WORK_TREE(如“在 git checkout 中包含子模块到GIT_WORK_TREE钩子中”)。

但更简单的解决方案是:

  • 让你的子模块保持在原来的位置。
  • 在您想要的位置添加该子模块存储库的另一个克隆 ( /path/to/sub)。
  • git --work-tree=/path/to/sub status使用父存储库中复制的子模块文件夹中的 检测原始子模块文件夹中的任何更改。

它将检测以下之间的变化:

  • 子模块存储库 HEAD(原始子模块文件夹,您在其中执行git --work-tree=/path/to/sub status命令)
  • 您指定的工作树 ( --work-tree=/path/to/sub)

你可以:

  • 从主父存储库外部的子模块克隆存储库(即:您想要的位置)工作
  • 直接从主父存储库的子模块文件夹(引用所有子模块的文件夹)检测在该外部文件夹中完成的更改