我可以使用子模块对git存储库进行“深层复制”吗?

Can I make a “deep copy” of a git repository with submodules?

很容易克隆整个项目及其所有子模块:

git clone --recursive [email protected]:homer/powerplant.git

但是,如何创建一个克隆,将所有这些子模块替换为各个子存储库本身的头?最好是以这样一种方式,只要有什么变化,就可以很容易地重复。目标应该是相同整体代码的只读"平面"版本。不需要合并。

如果这是可能的,它将解决我的启动板问题,其中bzr只能导入没有子模块的存储库。


如果您想从子模块的文件开始,而不是以git repos开始,只需执行以下操作:

  • 递归克隆git clone --recursive [email protected]:homer/powerplant.git(疯狂回购名称btw)
  • 然后用git config --remove-section submodule.name取消子模块的注册。

您将得到您想要的结果,工作树中的子模块文件,但是子模块没有初始化。

您可以使用最新的git submodule deinit命令,但它也会从工作树中删除子模块的文件。


你不能直接做,因为子模块从来没有被HEAD引用。它是一个Git特性,可以防止依赖项中不需要的更新,因此子模块由固定的sha1上的超级项目引用,可以通过提交(在超级项目中)新的子模块来更改。

不过,将子模块更新到克隆后的最后一个版本很简单:在超级项目中运行以下命令。

1
2
git submodule foreach git merge origin/master
git commit -am"updated all submodules to origin/master"

编辑

看起来您想在克隆后签出子模块,命令是

1
git submodule update --init --recursive