【问题标题】:Why can't I git bundle all parents?为什么我不能 git 捆绑所有父母?
【发布时间】:2018-08-07 11:12:11
【问题描述】:

我正在尝试创建一个只有部分历史记录的 git 包。我运行捆绑整个分支的命令是。 (reference)

git bundle create my.bundle --all

但是,如果我只想将初始提交捆绑到(不包括)特定提交,则正确的 rev-parse 语法是。 (reference)

git bundle create my.bundle dae86e1950b1277e545cee180551750029cfe735^@

但这失败了,git 说...

fatal: Refusing to create empty bundle.

如何创建仅包含初始提交和直到某个特定修订的所有历史记录的捆绑包?

编辑

found this post 解释了 git bundle 仅适用于标签(或其他参考,如 HEAD)。但是,我正在尝试捆绑一系列提交,但 .. 简写是专有的,不会包含初始提交。

【问题讨论】:

标签: git bundle


【解决方案1】:

简短的回答是你不能——嗯,不是相当。从本质上讲,git bundlegit fetch 的服务器部分:它会构建一个文件,然后当您将该文件从服务器传输到客户端时,您会真正将其移交 git fetch。客户端需要该文件包含服务器将传递给客户端的数据类型。

结果是捆绑文件必须包含:

  • 引用名称及其哈希 ID 的列表,以及
  • git fetch 将根据这些哈希 ID 获得的对象,减去
  • git fetch不需要基于客户端的“我已经拥有...”哈希 ID 的对象。

在准备捆绑包时,您提供的参数是:

  • 参考名称,以及
  • 如果客户端能够直接连接,客户端将提供的基础哈希 ID。

在这个你提供的东西列表中没有任何地方可以使用<em>rev</em>^@ 样式的引用。

你能做什么

可以做的就是将参考名称附加到每个头部:

for parent in $(git rev-parse ${rev}^@); do
    git tag bundle-p$parent $parent
done

现在你有了实际的参考名称(轻量级标签)指向你想要包含在包中的每个提交。您现在可以提供--tags='bundle-p*' 作为一组正引用,假设没有其他以bundle-p 开头的标签。 (您可以在之后删除标签以保持此不变性。您可以使用分支名称代替--branches='bundle-p*',如果这对您更方便。)

(请注意,${rev}^@ 在应用于根提交时不会产生任何输出。这意味着这种情况下不会有 bundle-p* 标记。)

如果您的特定停止点是普通的(单父)提交,您只需将单个引用名称附加到 ${rev}^。在所有情况下,您都必须将引用名称附加到您确实希望在包中包含的端点提交。

【讨论】:

  • @torak 谢谢!这正是我所需要的。我在我想要的提交及其git rev-list --max-parents=0 $rev 上放置了一个标签,并像你描述的那样使用git bundle create --tags='xxx'。另外 - 感谢您对 bundle 命令用途的解释。
猜你喜欢
  • 1970-01-01
  • 2016-12-21
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多