如何为特定提交生成Git修补程序?

如何为特定提交生成Git修补程序?,git,patch,Git,Patch,我需要编写一个脚本,为SHA-1提交编号列表创建补丁 我尝试使用git格式的补丁,但是自从那个SHA-1值之后,每次提交都会生成一个补丁。在生成了几百个补丁之后,我不得不终止这个过程 是否有办法仅为特定的SHA-1值生成修补程序?假设您在提交1后有提交id 2,您将能够运行: git diff 2 1 > mypatch.diff 其中2和1是SHA-1散列。尝试: git format-patch -1 <sha> 根据上面的文档链接,-1标志告诉Git补丁中应该包含多少

我需要编写一个脚本,为SHA-1提交编号列表创建补丁

我尝试使用
git格式的补丁
,但是自从那个SHA-1值之后,每次提交都会生成一个补丁。在生成了几百个补丁之后,我不得不终止这个过程


是否有办法仅为特定的SHA-1值生成修补程序?

假设您在提交1后有提交id 2,您将能够运行:

git diff 2 1 > mypatch.diff
其中2和1是SHA-1散列。

尝试:

git format-patch -1 <sha>
根据上面的文档链接,
-1
标志告诉Git补丁中应该包含多少提交

-

从最顶层提交准备修补程序


使用以下命令应用修补程序:

git am < file.patch
git am
用于从特定SHA-1哈希的最顶端提交生成修补程序:

git format-patch -<n> <SHA-1>

要从特定提交(而不是最后一次提交)生成修补程序,请执行以下操作:


如果您想确保(单一提交)补丁将应用于特定提交之上,可以使用新的git 2.9(2016年6月)选项
git格式补丁--base

git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git config format.useAutoBase true
git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE
参见,,(2016年4月26日)作者 (于2016年5月23日被合并)

格式化补丁
:添加“
--base
”选项以记录基本树信息 维护人员或第三方测试人员可能想知道确切的基本树 此修补程序系列适用于。将git格式补丁设定为'
--base
'选项 记录基本树信息并将其附加到第一个 信息(求职信或系列中的第一个补丁)

基本树信息由“基本提交”组成,这是一个众所周知的 承诺这是项目历史稳定部分的一部分 else工作于和零个或多个“必备补丁”,这些补丁是 尚未成为“基本提交”一部分的飞行中的知名补丁程序 这需要按拓扑顺序应用于“基本提交”之上 在应用修补程序之前

“基本提交”显示为“
基本提交:
”,后跟40个十六进制字符 提交对象名称。
“先决条件补丁”显示为“
先决条件补丁id:
”,后跟40十六进制“补丁id”,可通过“
git patch id--stable
”命令传递补丁来获得


Git 2.23(2019年第3季度)将改进这一点,因为“
格式补丁
”的“
--base
”选项以不稳定的方式计算了必备补丁的
补丁id
,该补丁id已更新为以与“
Git补丁id--stable
”兼容的方式计算

参见(2019年4月26日)作者 (于2019年6月13日合并)

格式化补丁
:使
基本补丁id
输出稳定 我们没有在每次处理一个大块头时刷新上下文
diff.c
中的补丁id生成代码,但我们在 使用“
补丁id
”工具生成“稳定”补丁id

让我们将类似的逻辑从
patch-id.c
移植到
diff.c
中,以便在为命令调用的“
format patch--base=
”类型生成补丁id时可以得到相同的哈希值


在Git 2.24(2019年第4季度)之前,“
Git格式补丁-o
”做了一个与“
mkdir
”相当的操作,而不是“
mkdir-p
”,这一操作正在被纠正

参见(2019年10月11日)作者 (于2019年10月18日合并)

:创建输出目录的前导组件 签字人:Bert Wesarg

“git format patch-o”与“
mkdir
”没有相同之处,正在更正

避免在可能有安全隐患的主要目录上使用“
adjust\u shared\u perm
”。通过临时禁用“
config.sharedepository
”实现,就像“
git init
”一样


在Git 2.25(2020年第1季度)中,“
Git rebase
”在设置了
format.useAutoBase
配置变量时工作不正常,该变量已被更正

参见,,(2019年12月4日)作者 (于2019年12月16日合并)

:修复
格式。使用自动数据库
报道人:克里斯蒂安·比辛格
签字人:刘丹东

使用
format.useAutoBase=true
,运行rebase会导致错误:

fatal: failed to get upstream, if you want to record base commit automatically,
please use git branch --set-upstream-to to track a remote branch.
Or you could specify base commit by --base=<base-commit-id> manually
error:
git encountered an error while preparing the patches to replay
these revisions:

ede2467cdedc63784887b587a61c36b7850ebfac..d8f581194799ae29bf5fa72a98cbae98a1198b12

As a result, git cannot rebase them.
这可能会让人非常困惑,因为用户请求的
--base
(因为这是在配置中,而不是在命令行中)并不一定是显而易见的

我们确实希望
--base=auto
在无法提供合适的基础时失败,因为如果格式化的修补程序在请求时没有包含基础信息,这同样会令人困惑

设定
格式。使用Autobase
一种新模式,“
启用时”

此模式将导致格式修补程序在可能的情况下尝试包含基本提交。但是,如果找不到有效的基本提交,则format patch将在没有基本提交的情况下继续格式化修补程序

为了避免另一个分支名称无法与
--base
一起使用,请不要教授
--base=wheable
--base=wheable

相反,重构
base\u commit
选项以使用回调,并依赖全局配置变量
auto\u base

这意味着用户不能从命令行请求此可选的基本提交生成。然而,这可能不太有价值。如果用户手动请求基本信息,将立即通知他们无法获取适当的基本提交。这允许用户在知情的情况下选择是否继续格式化

添加测试以涵盖
--base
的新操作模式

git config
现在在其

默认情况下,
格式化修补程序。
也可以设置为“
whenAble”<
git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE
git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git config format.useAutoBase true
git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE
fatal: failed to get upstream, if you want to record base commit automatically,
please use git branch --set-upstream-to to track a remote branch.
Or you could specify base commit by --base=<base-commit-id> manually
error:
git encountered an error while preparing the patches to replay
these revisions:

ede2467cdedc63784887b587a61c36b7850ebfac..d8f581194799ae29bf5fa72a98cbae98a1198b12

As a result, git cannot rebase them.
$ git format-patch -1 <an old commit>
fatal: base commit shouldn't be in revision list  
git format-patch -1 HEAD
git am -3k 001*.patch
git log --patch -1 $ID > $file