git - 你如何在 git 中 bundle 子模块的变化?

标签 git bundle git-submodules

如果我有一个包含子模块的存储库,并且我想为 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/

相关文章:

ruby-on-rails - GemNotFound 在开发中使用时抽取

git - 如何对 git 子模块使用相同的协议(protocol)?

git init 错误 : unable to create directory for . git/HEAD [inside htdocs/]

windows - Git 对 POSIX 功能的依赖在 Windows 上仍然是一个问题吗?

ios - 无法访问资源包

git - 我可以在 .gitconfig 中设置的 git clone 上使用 fetch recurseSubmodules

git - 如何在 GitHub 中创建嵌套存储库?

git - 在我的终端中并排着色的内联 git diff 输出

git - 自定义 Git 提交消息模板

linux - OSGi headless running on linux - org.eclipse.core.runtime 无法获取应用程序服务