Can I make a “deep copy” of a git repository with submodules?
很容易克隆整个项目及其所有子模块:
git clone --recursive [email protected]:homer/powerplant.git。
但是,如何创建一个克隆,将所有这些子模块替换为各个子存储库本身的头?最好是以这样一种方式,只要有什么变化,就可以很容易地重复。目标应该是相同整体代码的只读"平面"版本。不需要合并。
如果这是可能的,它将解决我的启动板问题,其中bzr只能导入没有子模块的存储库。
- 可能重复需要处理Git存档中的Git子模块
- 我对归档不感兴趣。我只想要一个Git存储库的深度副本,其中子模块结构已经消失,并被相应的代码替换。我更需要git flatten,如果它存在的话。
- 是的,我该如何在一行中克隆所有子模块上的递归和签出主模块?是更好的
- 不,那也是别的。子模块结构不会消失,因为您签出并且bzr仍然不理解它。我真的想要一个扁平的复制品,而不仅仅是一个普通的复制品。
如果您想从子模块的文件开始,而不是以git repos开始,只需执行以下操作:
- 递归克隆git clone --recursive [email protected]:homer/powerplant.git(疯狂回购名称btw)
- 然后用git config --remove-section submodule.name取消子模块的注册。
您将得到您想要的结果,工作树中的子模块文件,但是子模块没有初始化。
您可以使用最新的git submodule deinit命令,但它也会从工作树中删除子模块的文件。
- 我要检查LaunchPad是否接受这个,但我认为这确实是我想象的那样!
- 您对LaunchPad和Git子模块的问题是否有所报告?
- 当然可以:bugs.launchpad.net/bzr git/+bug/402814
你不能直接做,因为子模块从来没有被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 |
号
- 谢谢,但问题不是我不知道如何用子模块更新存储库。我想要一个存储库的副本,其中子模块已被它们的代码替换。否则,bzr将无法进口。
- 明白了,看看这个问题:我该如何克隆——在一行中的所有子模块上的递归和签出主模块?(我把正确的答案包括在我的答案中,不是所有的都是正确的)
- 是的,这是一个不同的问题。我认为在我的案例中,我不希望在目标存储库中有任何子模块的唯一解决方案是完全绕过git(并失去历史):rsync -avzul source-repos/ --exclude=.gitmodules --exclude=.git dest-repos/。现在在最终的存储库中,我不再拥有子模块了。比较github.com/dobots/aim和github.com/dobots/aim-bzr。
- 好的;那么您想要一个存储库的转储,不需要.gitrepo,并且包括子模块,对吗?
- 我想你想要的是github.com/meitar/git-archive-all.sh/wiki(从我该如何Git克隆——在一行中递归和签出所有子模块的主程序)?
- 很好的发现。它可能确实足够递归地运行Git存档。但是,在这种情况下,我更喜欢自己运行rsync(如上所述),所以我知道会发生什么。这是一条单行线,所以没什么麻烦。我只是觉得可能有一个我错过的选择。
- 当然,rsync可以在这里完成这项工作。不确定这样一个脚本的优点,但它必须知道一些事情。