Git捆绑单提交?

时间:2015-07-09 23:02:42

标签: git

我想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 - 通过 - 0d44b41捆绑为002.bundle并应用它?

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

我尝试使用此命令关注git-scm doc on bundle,该命令失败为:

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

2 个答案:

答案 0 :(得分:4)

我不确定你为什么要专门限制自己git bundle,但假设你想要那样,请注意the documentation中的这个措辞:

  

git-rev-list-args

     
    

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

  
     

指明参考

     
    

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

  

现在考虑你的命令:

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

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

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

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

答案 1 :(得分:0)

在 Git 2.31(2021 年第一季度)中,"git bundle"(man) 不会丢失引用,因为它们指向同一对象。

请参阅 commit 5bb0fd2commit ce1d6d9commit 9901164Jiang Xin (jiangxin)(2021 年 1 月 11 日)。
(于 2021 年 1 月 25 日在 Junio C Hamano -- gitster --commit 8b48981 合并)

<块引用>

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() 中删除重复对象时,错误地删除了一个具有相同名称的唯一挂起对象。

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

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

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

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