我想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.
答案 0 :(得分:4)
我不确定你为什么要专门限制自己git bundle
,但假设你做想要那样,请注意the documentation中的这个措辞:
git-rev-list-args
git rev-parse
和git 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 5bb0fd2 的 commit ce1d6d9、commit 9901164、Jiang 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()
,用于比较对象的地址和名称。