我有一个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 submodule absorbgitdirs
将每个子模块的.git
存储库目录移动到最高级超级项目存储库的.git
目录的子目录中,并且git submodule update --init
会将任何新的子模块克隆并将其存储库重定向到这样的位置。在过去的不好的日子里,每个子模块存储库都保存在每个子模块存储库的工作树的顶层。 - undefinedgit 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/*
目录中则存放着从子模块检出的文件。 - undefinedsp/path/to/sub/.git
是一个文件,其中包含子模块仓库本身的路径,现在位于sp/.git/modules/<more-path>
。因此,在现代设置中,rm -rf sp/path/to/sub
不会销毁子模块仓库,只会销毁检出。在旧的设置中,它实际上会销毁整个子模块仓库。 - undefined