如何为特定提交生成Git修补程序?
我需要编写一个脚本,为SHA-1提交编号列表创建补丁 我尝试使用如何为特定提交生成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补丁中应该包含多少
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