【问题标题】:Git bundle single commit?Git捆绑单次提交?
【发布时间】:2015-07-09 23:02:42
【问题描述】:

我想apply a patch including its commit message,如何捆绑单个提交并应用它?

给定历史示例:

0a8b835 intel_pmc_ipc: Add Intel Apollo Lake PMC IPC driver
0d44b41 tc1100-wmi: Delete an unnecessary check before the function call "kfree"
b8830a4 dell-laptop: Fix allocating & freeing SMI buffer page
2ec1e9e target: Bump core version to v5.0
  • 假设我想将0d44b41 捆绑为001.bundle,然后应用它?
  • 假设我想将b8830a4-through-0d44b41 捆绑为002.bundle,然后应用它?

注意:我已经可以使用补丁文件执行此操作,但我还想自动包含提交信息。

我尝试使用此命令跟随git-scm doc on bundle,但失败为:

$ git bundle create 001.bundle 0d44b41^ 0d44b41 
fatal: Refusing to create empty bundle.

【问题讨论】:

  • ...和git am 应用补丁。

标签: git


【解决方案1】:

我不确定您为什么要特别限制自己使用 git bundle,但假设您确实想要这样做,请注意 the documentation 中的措辞:

git-rev-list-args

git rev-parsegit rev-list 可接受的参数列表(并包含命名的 ref,请参阅下面的SPECIFYING REFERENCES),指定特定对象和传输引用。 ...

指定参考文献

git bundle 只会打包git show-ref 显示的引用: 这包括磁头、标签和远程磁头。

现在考虑你的命令:

$ git bundle create 001.bundle 0d44b41^ 0d44b41

create 001.bundle 指定要创建的文件。命令行的其余部分 0d44b41^ 0d44b41git-rev-list-args。您在这里使用了什么参考(分支或标签名称)?1


请注意,git format-patch 包括提交消息(和作者),使用 git am 将应用提交,包括原始消息(和作者,尽管您将成为提交者,除非您进行一些额外的设置工作)。


1当然是反问:你没有使用任何。我不确定为什么git bundle 如此坚持使用一个,因为您可以轻松地附加对原始 SHA-1 的引用,制作捆绑包,然后再次删除引用而不会干扰刚刚创建的捆绑包。这将允许你做你正在尝试的事情。或者,当然,如果有一个名称(例如分支或标签)指向您想要捆绑的单个提交,您可以直接使用该现有名称。

【讨论】:

  • 非常感谢,我不知道 git am 做了我想要的,因为 SO page I got git bundle from 声称这是打包提交的_the_way。
  • 这是 git,总有至少十几种方法可以做任何事情,其中​​六种是错误的,另外三种真的很痛苦。 :-)
【解决方案2】:

在 Git 2.31(2021 年第一季度)中,“git bundle(man) 不会丢失指向同一个对象的引用。

Jiang Xin (jiangxin) 参见 commit 5bb0fd2commit ce1d6d9commit 9901164(2021 年 1 月 11 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 8b48981,2021 年 1 月 25 日)

bundle: 删除重复挂起时丢失对象

签字人:蒋欣

git rev-list(man) 将为以下命令列出一个提交:

$ git rev-list 'main^!'
<tip-commit-of-main-branch>

但是向git bundle(man) 提供相同的 rev-list 参数,无法创建捆绑文件。

$ git bundle create - 'main^!'
# v2 git bundle
-<OID> <one-line-message>

fatal: Refusing to create empty bundle.

这是因为在函数object_array_remove_duplicates()中删除重复对象时,错误地删除了一个唯一的同名待处理对象。

上例中的revision arg 'main^!'被handle_revision_arg()解析,至少有两个不同的对象会附加到revs.pending,一个指向“main”分支的父提交,其他点指向“main”分支的提示提交。
这两个对象具有相同的名称“main”。
调用函数object_array_remove_duplicates()后,只剩下一个名为“main”的对象。

更糟糕的是,在将边界提交添加到待处理列表时,我们使用单行提交消息作为名称,任意名称可能会让git-bundle感到惊讶。

仅比较对象本身(“.item”)也不够好,因为用户可能希望创建一个包含两个相同对象但引用名称不同的包,例如:“HEAD”和“@987654354” @"。

添加新函数contains_object() 比较对象的地址和名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2020-06-12
    • 2017-12-22
    • 1970-01-01
    相关资源
    最近更新 更多