Git子模块 - 如何撤销git submodule update --init。

4

我有一个Git项目,其中包含多个子模块。 从现在到一年前,有几个子模块已经移动 - 甚至有些子模块已经向下移动一个目录级别。另一个子模块从一个URL和位置移动到了另一个。Git并不喜欢这样的更改。:)

当我有我的git并运行git submodule update --init之后,我就不能运行

$ git checkout OLDSHA
fatal: not a git repository: sub/depdir/../../.git/modules/sub/depdir

或者我得到

fatal: could not get a repository handle for submodule 'sub/depdir'

如果我从头克隆git,运行git checkout OLDSHA - 然后git submodule update --init,没有问题。
那么我的问题是:是否有一种方法可以撤消git submodule update --init,使我回到像git clone PROJECT && cd project && git checkout OLDSHA之后的状态?
注意:这不是关于摆脱子模块的问题,而是为了使我能够更有效地在这些更改中运行git bisect,而无需从头重新克隆。

我不确定是否有一种真正干净的方法来处理这个问题。吸收Git目录提供了一个可能的解决方案,但实际上并没有解决真正的问题(即:重新映射子模块的位置而无需重新克隆子模块仓库)。 - undefined
@torek 谢谢你的意见。你说的“被吸收的Git目录”是什么意思? - undefined
在相当长的一段时间里(我认为它甚至被回溯到了Git 1.7.x,但在2.x中已成为标准),git submodule absorbgitdirs 将每个子模块的 .git 存储库目录移动到最高级超级项目存储库的 .git 目录的子目录中,并且 git submodule update --init 会将任何新的子模块克隆并将其存储库重定向到这样的位置。在过去的不好的日子里,每个子模块存储库都保存在每个子模块存储库的工作树的顶层。 - undefined
例如,假设您有一个超级项目,您可以使用git clone <url> sp克隆它。这将为您提供一个已检出的超级项目Git副本,位于./sp目录下;而实际的仓库位于./sp/.git目录下。进一步假设sp包含一个名为path/to/sub的子模块。那么在./sp/path/to/sub目录下会存在一个./sp/path/to/sub/目录。在旧的(吸收之前)时代,sp/path/to/sub/.git/目录中会存在子模块的仓库,而sp/path/to/sub/*目录中则存放着从子模块检出的文件。 - undefined
在现代设置中,sp/path/to/sub/.git是一个文件,其中包含子模块仓库本身的路径,现在位于sp/.git/modules/<more-path>。因此,在现代设置中,rm -rf sp/path/to/sub 不会销毁子模块仓库,只会销毁检出。在旧的设置中,它实际上会销毁整个子模块仓库 - undefined
好评 @torek - undefined
1个回答

1
使用更新版本的git,我现在可以运行了。
git submodule deinit sub/depdir

然后

git checkout some_old_sha 

工作得很顺利

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接