我需要编写一个脚本来为SHA1提交编号列表创建补丁。
我尝试使用git format-patch <the SHA1>
,但是自SHA1以来,每次提交都会生成一个补丁。 生成几百个补丁后,我不得不终止该过程。
有没有一种方法只能为特定的SHA1生成补丁?
#1楼
为了从特定sha1哈希的最高提交生成补丁:
git format-patch -<n> <SHA1>
从头开始的最后10个补丁在一个补丁文件中:
git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch
#2楼
要从特定提交(而不是最后一次提交)生成路径:
git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE
#3楼
如果您想确保(单次提交)修补程序将应用于特定的提交,则可以使用新的git 2.9(2016年6月)选项git format-patch --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
请参见Xiaolong Ye(``)的 commit bb52995 , commit 3de6651 , commit fa2ab86 , commit ded2c09 (2016年4月26日) 。
(由Junio C gitster
- gitster
在commit 72ce3ff中合并 ,2016年5月23日)
format-patch
:添加'--base
'选项以记录基础树信息维护人员或第三方测试人员可能想知道补丁程序系列适用的确切基础树。 教git format-patch一个'
--base
'选项来记录基础树信息,并将其附加在第一条消息的末尾(求职信或系列中的第一个补丁)。基础树信息由“基础提交”(这是众所周知的提交,它是其他所有人都在其中进行工作的项目历史的稳定部分的一部分)组成,并且包含零个或多个“先决条件补丁”(众所周知)尚不属于“基本提交”的飞行中补丁,需要先以拓扑顺序在“基本提交”之上应用,然后才能应用补丁。
“基本提交”显示为“
base-commit:
”,后跟提交对象名称的40进制。
“先决条件补丁”显示为“prerequisite-patch-id:
”,后跟40个十六进制的“补丁ID”,可以通过将补丁通过“git patch-id --stable
”命令来获得。
Git 2.23(2019年第三季度)将对此进行改进,因为“ format-patch
”的“ --base
”选项以一种不稳定的方式计算了必备补丁的patch-ids
,该更新已更新为与“ git patch-id --stable
”。
参见Stephen Boyd( akshayka
)的 commit a8f6855和commit 6f93d26 (2019年4月26日) 。
(由Junio C gitster
- gitster
在commit 8202d12中合并 ,2019年6月13日)
format-patch
:使--base patch-id
输出稳定每次处理
diff.c
中的patch-id
生成代码中的diff.c
,我们并没有刷新上下文,但是当我们使用'patch-id
'工具生成“稳定的” patch-id时,我们就是这样做的。让我们将类似的逻辑从
patch-id.c
到diff.c
以便在为命令调用的format-patch --base=
类型生成patch-id时获得相同的哈希值。
在Git 2.24(2019年第四季度)之前,“ git format-patch -o <outdir>
”等效于“ mkdir <outdir>
”而不是“ mkdir -p <outdir>
”,该问题已得到纠正。
请参阅Bert Wesarg( bertwesarg
)的 commit edefc31 (2019年10月11日) 。
(由Junio C gitster
- gitster
在commit f1afbb0中合并 ,2019年10月18日)
format-patch
:创建输出目录的主要组件签名人:Bert Wesarg
'git format-patch -o'等效于'mkdir'而不是'mkdir -p',正在纠正。
避免在前导目录上使用“
adjust_shared_perm
”,这可能会带来安全隐患。 通过像git init
一样暂时禁用config.sharedRepository
来实现。
#4楼
此命令(如@ Naftuli Tzvi Kay所建议):
git format-patch -1 HEAD
将HEAD
替换为特定的哈希或范围。
将为最新提交格式类似于UNIX邮箱格式的提交生成补丁文件。
-<n>
-从最上面的提交准备补丁。
然后,您可以通过以下方式以邮箱格式重新应用补丁文件:
git am -3k 001*.patch
请参阅: man git-format-patch
。
#5楼
仅针对特定SHA1生成补丁的方法是什么?
很简单:
选项1. git show commitID > myFile.patch
选项2. git commitID~1..commitID > myFile.patch
注意:用实际的提交ID(SHA1提交代码)替换commitID
。
#6楼
git format-patch commit_Id~1..commit_Id
git apply patch-file-name
快速简单的解决方案。
#7楼
如果只需要diff指定的文件,则可以:
git diff master 766eceb-连接/> 000-mysql-connector.patch
#8楼
假设您在提交1之后拥有提交ID 2,则可以运行:
git diff 2 1 > mypatch.diff
其中2和1是SHA哈希。
#9楼
尝试:
git format-patch -1 <sha>
要么
git format-patch -1 HEAD
根据上面的文档链接, -1
标志告诉git补丁中应该包含多少个提交;
-<n>
从最顶层的提交准备补丁。
使用以下命令应用补丁:
git am < file.patch