如何在 git 中捆绑子模块更改?

RBF*_*F06 4 git bundle git-submodules

如果我有一个包含子模块的存储库,并且我想为sneakernet制作一个捆绑包,如何使该捆绑包包含更新子模块所需的对象?

例如,假设我有一个名为 的存储库parent,它包含一个名为 的子模块submod。我想创建一个包含自 commit 以来所有最近工作的包,所以很自然地,我会basecommit从根目录中执行以下操作:parent

git bundle create mybundlefile.bundle basecommit..myworkingbranch
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为 的文件,其中包含范围内存储库mybundlefile.bundle中的所有提交对象以及 ref 。问题是,如果这些提交中的任何一个更改了子模块,则生成的捆绑包将不会很有用,因为此类提交仅在更改子模块哈希时存储在捆绑包文件中。因此,存储在捆绑文件中的对象只是说“我正在提交,我将子模块的哈希值从更改为”。但该捆绑包实际上并不包含从捆绑包更新子模块并为.parentbasecommit..myworkingbranchmyworkingbranch3ba024bsubmod2b941cf1bb84ec2b941cf..1bb84ecmyworkingbranch

如何创建捆绑文件,以便还包含子模块存储库中的所有对象。也就是说,如果父存储库的基本提交将basecommit子模块submod指向 hash A,而父存储库的工作分支myworkingbranch将子模块submod指向 hash B,那么我的包不仅需要包含basecommit..myworkingbranch,还需要包含A..B

tor*_*rek 5

\n

如何创建捆绑文件,以便还包含子模块存储库中的所有对象。

\n
\n\n

你不能。捆绑文件特定于 Git 存储库。子模块只是到另一个Git 存储库的链接,因此您必须为单独的 Git 存储库创建单独的包。(然后您可以将各个捆绑包制作为存档。)

\n\n

很明显,Git 可以深入到每个子模块并git bundle在每个这样的子模块中运行,为您生成这些不同的文件。不过,传递给子命令的参数git bundle很棘手。您必须编写自己的脚本并使用git submodule foreach它在每个子模块中运行,并让您的脚本找出要使用的参数。

\n\n

然后,您可能希望将每个捆绑包打包在一起(大概打包成 tar 或 rar 或 zip 或其他存档)以进行传输和解绑/获取。在解绑期间您将需要另一个git submodule foreach,这可能会更烦人,因为理想情况下,这应该使用一组新的子模块(在解绑顶级子模块并选择适当的提交之后)。

\n\n

可能有人编写了脚本来执行此操作,但如果是这样,我不知道。它不包含在 Git 本身中\xe2\x80\x94bundle 本身有点笨拙和非主流。

\n