如果我有一个包含子模块的存储库,并且我想为 sneakernet 制作一个 bundle ,我该如何使 bundle 包含更新子模块所需的对象?
例如,假设我有一个名为 parent
的存储库,它包含一个名为 submod
的子模块。我想创建一个包,其中包含自提交 basecommit
以来的所有最新工作,因此很自然地,我会从 parent
根目录中执行以下操作:
git bundle create mybundlefile.bundle basecommit..myworkingbranch
这会创建一个名为 mybundlefile.bundle
的文件,其中包含 parent
存储库中 basecommit..myworkingbranch
范围内的所有提交对象,如下所示以及 ref myworkingbranch
。问题是,如果这些提交中的任何一个更改了子模块,生成的包将不会非常有用,因为此类提交仅作为更改子模块哈希存储在包文件中。所以存储在 bundle 文件中的对象只是说“我提交 3ba024b
并且我将子模块 submod
的散列从 2b941cf
更改为 1bb84ec
。”但 bundle 实际上并不包含对象 2b941cf..1bb84ec
necceassary 从 bundle 更新子模块并为 myworkingbranch
创建一个干净的工作树。
如何创建 bundle 文件,以便还包含子模块存储库中的所有这些对象。也就是说,如果父 repo 的基础提交 basecommit
指向子模块 submod
在散列 A
和父 repo 的工作分支 myworkingbranch
将子模块 submod
指向散列 B
,那么我的包不仅需要包含 basecommit..myworkingbranch
,还需要包含 A.. B
.
最佳答案
How do I create the bundle file such that all those objects from the submodule repos are also included.
你不能。 bundle 文件特定于 Git 存储库。子模块只是指向另一个 Git 存储库的链接,因此您必须为单独的 Git 存储库创建一个单独的包。 (然后您可以将各种包归档。)
很明显,Git 可以深入到每个子模块并在每个子模块中运行 git bundle
,为您制作这些不同的文件。不过,传递给子 git bundle
命令的参数很棘手。您必须编写自己的脚本并使用 git submodule foreach
让它在每个子模块中运行,并让您的脚本找出要使用的参数。
然后您可能希望将每个包打包在一起(可能是 tar 或 rar 或 zip 或任何存档)以进行传输和拆分/获取。在解绑期间你会需要另一个 git submodule foreach
,这可能会更烦人,因为理想情况下这应该使用新的子模块集(在解绑顶级模块并选择适当的提交之后)。
可能有人编写了脚本来执行此操作,但如果是这样,我就不知道了。它不包含在 Git 本身中—— bundle 本身有点笨拙和非主流。
关于git - 你如何在 git 中 bundle 子模块的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49321446/