2

我有一个巨大的 git 存储库,我想在我的本地 Mac OS 客户端和在虚拟机中运行的“来宾”Linux 客户端之间共享它。我在两者(1.7.12.2)上都构建了最新版本的 git,并且我从 Mac OS 克隆了存储库。问题是在 Linux 中,子模块无法识别:

$ git status
fatal: Not a git repository: /blah/android-wmon/.git/modules/core/modules/galaxynexus-cm10-kernel
fatal: 'git status --porcelain' failed in submodule core

在这两个操作系统之间共享一个 git 存储库是不可能的吗?我不会想到这是一个问题。

4

1 回答 1

1

如果我在mac端做“ git submodule init”和“ git submodule update”,为什么我还需要在linux端做呢?

这两个子模块命令用于本地存储库(您刚刚克隆的一个)。

  • git submodule init初始化您的本地配置文件,并且
  • git submodule update从该项目中获取所有数据并检查您的父 repo 中列出的适当提交。

在一个本地存储库中执行此操作对任何其他克隆的存储库(例如 Linux 上的那个,从 Mac 上的存储库克隆)都没有副作用。
您需要为您的第二个本地存储库(Linux 服务器本地)再次执行这些命令以获取所有数据。

注意:确保你做了一个简单的git clone而不是一个git clone --reference.

另外:确保您的子模块没有被完整路径引用(取决于您的 git 版本):请参阅此线程

您所说的“最后一次更新”是什么?v1.7.8 为子模块引入了单独的 git dir,并使用了绝对路径。

此绝对路径已更改为此补丁集中的相对路径,该补丁集中存在于 v1.7.10-rc1 中。

从最近开始,一个名为的子模块<name>的 git 目录位于超级项目的.git/modules/<name>目录中,而工作树包含一个指向那里的 gitfile。
当子模块的 git 目录因为在 clone 命令中找不到而需要克隆时,.git/modules/<name>会在 gitfile 中写入一个绝对路径。当不需要克隆时,git-submodule.sh脚本将通过将相对路径写入gitfile.

这是不一致的,因为行为取决于之前已克隆到.git/modules of the superproject.
这里最好使用相对路径,因为它允许在不使 gitfile 无效的情况下移动超级项目。
我们通过始终将相对路径写入 来做到这一点gitfile,这会覆盖克隆命令可能已经写入那里的绝对路径。

于 2012-10-03T20:39:36.733 回答