针对一个文件的所有提交,使用git format-patch进行格式化补丁。

9
我想获取一个文件/文件夹的所有提交所做的补丁。
我可以通过git log --format="%H"-- path/to/folder获取提交ID列表。
有没有办法从这个列表中生成补丁。
[编辑]:
下面的代码部分解决了我的问题 for c in `git log --format="%H" -- path/to/file`;do git format-patch "$c^1".."$c" -o patches ; done 由于format-patch是单独调用的,我将得到所有编号为0001-commit-text.patch的补丁,其中我将失去补丁的顺序。是否有更好的解决方案?
4个回答

6
你可以尝试使用命令 git diff initial_commit_id..latest_commit_id > changes.patch 来生成补丁文件。这个方法可以参考这篇文章:https://www.lullabot.com/articles/git-best-practices-upgrading-the-patch-process。例如:
git diff ab0b3a55de5..6f5dbbc4187b97

更新: 如果你在format-patch命令中提供了特定文件的路径作为参数,它只会为该文件有更改的提交创建补丁。所以不需要循环和逐个调用format-patch。 可以参考format-patch for a single file的示例。

因此,请尝试以下内容:

get format-patch from..to -o patches /path/to/file 

这将会给出一个单一的补丁。我希望有分开的补丁。 - prahlad venkata
那我猜这个问题在这里已经得到了回答:https://dev59.com/K2w15IYBdhLWcg3wYKmo - kofman
所有答案仅适用于我想要一系列提交,而不是如果我的提交在日志中的随机点。 - prahlad venkata
如果您将特定文件的路径作为参数提供给format-patch,它只会为更改该文件的提交创建补丁。因此无需循环和逐个调用format-patch。 请参见https://dev59.com/hGsz5IYBdhLWcg3weHgA中的示例。 - kofman

6
我准备了以下shell脚本来实现此目的。欢迎提供其他答案。
#!/bin/bash
COUNTER=1;
for c in `git log --format="%H" --reverse -- path/to/file`;do
    git format-patch --start-number=$COUNTER "$c^1".."$c" -o patches
    let COUNTER=COUNTER+1
done

4

我只使用 git 进行了轻微的改进(刚刚创作):

git format-patch $(git rev-list --max-parents=0 HEAD)..HEAD -- path/to/file

如果 rev-list --max-parents 返回不止一个提交,则可能无法工作。使用了该帖子的想法:

如何通过 'git log' 显示第一次提交?


1
我在Debian 10主机上克隆了一个Linux内核git仓库进行测试。效果如广告所述。+1。 - Jonathan Ben-Avraham
1
注意,如果您想要的文件在存储库的第一个提交中,则会“失败”,无法获取第一个提交。 - sastorsl
1
可以在文件位于初始/第一次提交时使用 git format-patch --root(不带任何 SHA)进行操作。参考 https://dev59.com/nWgu5IYBdhLWcg3wnoSC - sastorsl
@sastorsl,观察得真仔细!在我的命令中使用这个开关替换范围可以生成完整的补丁集(即使文件属于存储库中的初始提交)。你可以检查一下。我认为你应该把这个作为答案发表 :) - saulius2

1
在其他答案的基础上进行补充。
如果你想要获取一个文件在初始/第一个提交中的所有提交记录,你必须省略SHA。即使使用^1也无法在这种情况下"起作用"。
git format-patch --root

参考如何在初次提交时使用git format-patch


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接