gpt4 book ai didi

git - 移动包含子模块的 git 工作副本

转载 作者:太空狗 更新时间:2023-10-29 13:08:45 30 4
gpt4 key购买 nike

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

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

my project ,我有以下 .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 存储库)

请注意,这与之前的问题不同Moving the parent directory of a git repository that contains submodules从某种意义上说,我确定这不是与我的 .gitmodules 文件中存在绝对路径相关的问题。

最佳答案

.git/module组织可以追溯到 git1.7.8 (December 2d, 2011) :

When populating a new submodule directory with "git submodule init", the $GIT_DIR metainformation directory for submodules is created inside $GIT_DIR/modules/<name>/ directory of the superproject and referenced via the gitfile mechanism.
This is to make it possible to switch between commits in the superproject that has and does not have the submodule in the tree without re-cloning.

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

"git submodule update", when recursed into sub-submodules, did not acccumulate the prefix paths.

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


此处,OP Thomas Moulard 提到了一种可能的解决方案(使用最新的 git 1.8.3,2013 年 4 月 22 日)。在 the comments :

$ git submodule deinit -f . is working!
Then I can run git submodule init and the paths get fixed

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

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

关于git - 移动包含子模块的 git 工作副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16160993/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com