8

Git 最近的一次更改改变了.git使用子模块时处理目录的方式。现在不是.git每个子模块都有一个,而是所有内容都位于“根级”.git目录中(对应于包括子模块的工作副本的目录)。

然后,在每个子模块中,创建一个指向目录新位置的.git文件。

我的项目中,我有以下.gitmodules文件:

[submodule "tests/shared-tests"]
        path = tests/shared-tests
        url = git://github.com/roboptim/roboptim-shared-tests.git
[submodule "cmake"]
        path = cmake
        url = git://github.com/jrl-umi3218/jrl-cmakemodules.git

当我这样做时git clone --recursive,我会获得:

$ cat cmake/.git
gitdir: /home/moulard/profiles/default-x86_64-linux-ubuntu-12.04.1/src/unstable/roboptim/roboptim-core/.git/modules/cmake

我目前正在使用 Git 1.8.1.5。

我的问题是:

  1. 为什么这种行为会改变?我认为这种新策略没有任何明显的好处。
  2. 我怎样才能安全地移动工作副本?(如果我移动我的工作副本,我会收到一条错误消息,告诉我损坏的 gitdir 的路径不再是 Git 存储库)

请注意,这与上一个问题移动包含子模块的 git 存储库的父目录不同,因为我确信这不是与我的.gitmodules文件中存在绝对路径相关的问题。

4

2 回答 2

9

.git/module组织可以追溯到git1.7.8(2011 年 12 月 2 日)

git submodule init当使用“ ”填充新的子模块目录时,子模块的元信息目录在超级项目的目录中$GIT_DIR创建$GIT_DIR/modules/<name>/并通过 gitfile 机制引用。
这是为了可以在不重新克隆的情况下在树中具有和不具有子模块的超级项目中的提交之间进行切换

但是,最近的错误修复已包含在1.8.2.11.8.3(2013 年 4 月 22 日)中:

“git submodule update”,当递归到子子模块时,没有累积前缀路径。

所以升级到最新的 git 版本可以解决这个问题。


在这里, OP Thomas Moulard评论中提到了一种可能的解决方案(使用最新的 git 1.8.3,2013 年 4 月 22 日):

$ git submodule deinit -f .正在工作中!
然后我可以跑步git submodule init,路径得到修复

如果(反)初始化步骤 ( .git/modules)

它不处理在文件add中记录子模块 url 的 ' ' 步骤.gitmodules:您仍然需要在该文件中手动删除它。

于 2013-04-23T05:53:43.763 回答
1

在将工作副本移至其他地方后,我成功地修复了我的工作副本,执行以下操作:

  • 更新文件中的gitdir:路径superproject/path/to/submodule/.git
  • 更新文件中的worktree=路径superproject/.git/modules/path/to/submodule/config

我不知道为什么 git 在那里使用绝对路径!

(在 git 2.0.1.563 上测试)

于 2014-11-18T14:30:48.423 回答