为特定的提交生成一个 git 补丁

我需要编写一个脚本来为 SHA1 提交编号列表创建补丁。

我尝试使用git format-patch <the SHA1> ,但是自 SHA1 以来,每次提交都会生成一个补丁。生成几百个补丁后,我不得不终止该过程。

有没有一种方法只能为特定的 SHA1 生成补丁?

答案

尝试:

git <a href="https://www.kernel.org/pub/software/scm/git/docs/git-format-patch.html" rel="noreferrer">format-patch</a> -1 <sha>

要么

git format-patch -1 HEAD

根据上面的文档链接, -1标志告诉 git 补丁中应该包含多少个提交;

-

从最顶层的提交准备补丁。


使用以下命令应用补丁:

git am < file.patch

为了从特定 sha1 哈希的最高提交生成补丁:

git format-patch -<n> <SHA1>

从头开始的最后 10 个补丁在一个补丁文件中:

git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch

假设您在提交 1 之后拥有提交 ID 2,则可以运行:

git diff 2 1 > mypatch.diff

其中 2 和 1 是 SHA 哈希。

此命令(如@ Naftuli Tzvi Kay所建议):

git format-patch -1 HEAD

HEAD替换为特定的哈希或范围。

将为最新提交格式类似于 UNIX 邮箱格式的提交生成补丁文件。

-<n> - 从最上面的提交准备补丁。

然后,您可以通过以下方式以邮箱格式重新应用补丁文件:

git am -3k 001*.patch

请参阅: man git-format-patch

git format-patch commit_Id~1..commit_Id  
git apply patch-file-name

快速简单的解决方案。

如果您想确保(单次提交)修补程序将应用在特定的提交之上,则可以使用新的 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(``)的 提交 bb52995提交 3de6651提交 fa2ab86提交 ded2c09 (2016 年 4 月 26 日
(由Junio C gitster - gitstercommit 72ce3ff 中合并 ,2016 年 5 月 23 日)

format-patch :添加 ' --base ' 选项以记录基础树信息

维护人员或第三方测试人员可能想知道补丁程序系列适用的确切基础树。教 git format-patch 一个 ' --base ' 选项来记录基础树信息,并将其附加在第一条消息的末尾(求职信或系列中的第一个补丁)。

基本树信息包含 “基本提交”(这是众所周知的提交,它是其他所有人都在其中工作的项目历史记录的稳定部分的一部分),以及零个或多个众所周知的 “必备补丁”。尚不属于 “基本提交” 一部分的飞行中的补丁,需要先以拓扑顺序在 “基本提交” 之上应用,然后才能应用补丁。

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


Git 2.23(2019 年第三季度)将对此进行改进,因为 “ format-patch ” 的 “ --base ” 选项以一种不稳定的方式计算了必备补丁的patch-ids ,该更新已更新为与 “ git patch-id --stable ”。

参见Stephen Boyd( akshayka )的 commit a8f6855commit 6f93d26 (2019 年 4 月 26 日
(由Junio C gitster - gitstercommit 8202d12 中合并 ,2019 年 6 月 13 日)

format-patch :使--base patch-id输出稳定

每次处理diff.c中的patch-id生成代码中的diff.c ,我们并没有刷新上下文,但是当我们使用 ' patch-id '工具生成 “稳定的” patch-id 时,我们就是这样做的。

让我们将类似的逻辑从patch-id.cdiff.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 - gitstercommit f1afbb0 中合并 ,2019 年 10 月 18 日)

format-patch :创建输出目录的主要组件

签名人:Bert Wesarg

'git format-patch -o' 等效于'mkdir' 而不是'mkdir -p',正在纠正。

避免在前导目录上使用 “ adjust_shared_perm ”,这可能会带来安全隐患。通过像git init一样暂时禁用config.sharedRepository来实现。


在 Git 2.25(2020 年第 1 季度)中,设置format.useAutoBase配置变量后,“ git rebase ” 无法正常工作,该问题已得到纠正。

请参见Denton Liu( Denton-L )的 commit cae0bc0commit 945dc55commit 700e006commit a749d01commit 0c47e06 (2019 年 12 月 4 日
(由Junio C gitster - gitstercommit 71a7de7 中合并 ,2019 年 12 月 16 日)

rebase :修复format.useAutoBase损坏

报道者:克里斯汀 · 比辛格
签字人:刘丹顿

使用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.

通过始终将--no-base传递给 rebase 的 format-patch 来解决此问题,以便使format.useAutoBase的效果format.useAutoBase

要从特定提交(而不是最后一次提交)生成路径:

git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE

如果只需要 diff 指定的文件,则可以:

git diff master 766eceb - 连接 /> 000-mysql-connector.patch

仅针对特定 SHA1 生成补丁的方法是什么?

很简单:

选项 1. git show commitID > myFile.patch

选项 2. git commitID~1..commitID > myFile.patch

注意:用实际的提交 ID(SHA1 提交代码)替换commitID