使用子模块移动存储库是有问题的
我在想,最初我可能已经在旧操作系统的 App_V3 文件夹中设置了 Git
这就是问题的根源。
重要的是最初创建存储库(或更具体地说,引用的子模块)时的 git 版本。
考虑一个包含一个子模块的存储库,vendor/awesome
创建子模块时 git 的行为是完全不同的。
git 版本 < 1.7.8
的内容vendor/awesome/.git
是一个文件夹 - 就像任何 git checkout 一样,例如 checkout 的文件夹结构是:
.gitmodules
.git
...
vendor/
awesome
.git
config
HEAD
index
packed-refs
...
移动这种存储库没有问题,因为任何地方都没有存储路径。
git 版本 1.7.8 或 1.7.9
1.7.8 移动了一个子模块的 .git 文件夹的位置
当使用“git submodule init”填充新的子模块目录时,子模块的 $GIT_DIR 元信息目录在超级项目的 $GIT_DIR/modules// 目录中创建并通过 gitfile 机制引用。这是为了可以在不重新克隆的情况下在树中具有和不具有子模块的超级项目中的提交之间进行切换。
因此vendor/awesome/.git
不是文件夹,而是具有以下内容的文件:
gitdir: /absolute/path/to/main/repo/.git/modules/vendor/awesome
整体文件夹结构为:
.gitmodules
.git
...
modules
vendor
awesome
config
HEAD
index
packed-refs
...
vendor/
awesome
.git <- a file
的内容.git/modules/vendor/awesome/config
指定工作树的位置:
[core]
...
worktree = /absolute/path/to/main/repo/vendor/awesome
这是一个非常棒的变化——但是它引入了一个问题,因为使用绝对路径来引用位置。
git 版本 >= 1.7.10
在1.7.10 版本中,修改了子模块中绝对路径的使用
包含由“git submodule”管理的顶级超级项目的整个目录可以移动到另一个地方。
现在vendor/awesome/.git
,如果使用此版本或更高版本的 git 生成,将包含:
gitdir: ../../.git/modules/vendor/awesome
的内容.git/modules/vendor/awesome/config
指定工作树的位置:
[core]
...
worktree = ../../../../vendor/awesome
再一次,移动这种存储库没有问题,因为路径是相对于主存储库的。
移动存储库
使用旧版本或新版本的 git - 你很好。
如果您不幸在 1.7.8 或 1.7.9 中创建的存储库上工作(从问题中的证据来看似乎就是这种情况)并移动存储库 - 有两种解决方案:
- 再次克隆
- 更正子模块 .git 文件中的路径,以及相应的工作树配置设置