从 git 存储库创建补丁或差异文件并将其应用到另一个不同的 git 存储库
Posted
技术标签:
【中文标题】从 git 存储库创建补丁或差异文件并将其应用到另一个不同的 git 存储库【英文标题】:Create patch or diff file from git repository and apply it to another different git repository 【发布时间】:2015-03-27 08:59:45 【问题描述】:我从事基于 WordPress 的项目,我想在每个新发布的 WP 版本中修补我的项目。为此,我想在两个提交或标签之间生成一个补丁。
例如,在我的 repo /www/WP
我这样做:
$ git patch-format com1..com2 --stdout > '~/patchs/mypatch.patch'
# or
$ git patch-format tag1..tag2 --stdout > '~/patchs/mypatch.patch'
/www/WP
git natif WordPress
/www/myproject
我的git项目基于WordPress
git apply
命令行不起作用,我认为是因为我们位于不同的存储库中。
我可以在没有提交的情况下生成一个补丁文件,只是一个差异并将其应用到另一个 git 存储库吗?
谢谢。
【问题讨论】:
【参考方案1】:您可以只使用git diff
来生成适合git apply
的unified diff:
git diff tag1..tag2 > mypatch.patch
然后您可以通过以下方式应用生成的补丁:
git apply mypatch.patch
【讨论】:
谢谢 Enrico,我使用了$git diff -u tag1..tag2 > mypatch.patch
和 $git apply --stat > mypatch.patch
答案是 0 files changed
任何其他建议好吗? :)
您需要将补丁文件的路径指定为git apply
的参数。我用一个例子更新了我的答案。
我使用了git diff -p tag1 tag2 > my.patch
,效果很好。
如何制作统一差异格式的补丁? sourceware.org/glibc/wiki/… 说 Only unified diff (-uNr) format is acceptable.
但是当我尝试 git diff -uNr tag1..tag2 > mypatch.patch
我收到消息 usage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
小心git diff ...
+ git apply ...
不正确处理已删除/移动的文件......当git format-patch ...
+ git am ...
这样做时。【参考方案2】:
要为多个提交生成补丁,您应该使用format-patch
git 命令,例如
git format-patch -k --stdout R1..R2
这会将您的提交以邮箱格式导出到补丁文件中。
要为最后一次提交生成补丁,运行:
git format-patch -k --stdout HEAD~1
然后在另一个存储库中通过am
git 命令应用补丁,例如
git am -3 -k file.patch
请参阅:man git-format-patch
和 git-am
。
【讨论】:
可以用patch -p1
应用的补丁怎么样? sourceware.org/glibc/wiki/…
我正在将补丁从 linux 移动到 winodws,因此必须使用这里提到的 --ignore-whitespace ***.com/questions/13190679/…
@AaronFranke,你可以试试'-p'选项:git format-patch -p HEAD^1
注意,这样做的好处是可以保留原始提交的提交消息、作者和提交日期。
--stdout
会将输出转储到终端,您需要使用> file.patch
进行管道传输。或者,如果您不包含--stdout
,它会生成格式为nnnn-commt-message.patch
的文件(其中nnnn
是从0001
开始的滚动数字)。【参考方案3】:
你可以应用两个命令
git diff --patch > mypatch.patch
// 生成补丁`
git apply mypatch.patch
// 应用补丁`
【讨论】:
【参考方案4】:作为补充,要为一个特定的提交生成补丁,请使用:
git format-patch -1 <sha>
生成补丁文件时,请确保您的其他 repo 在您使用 git am $patch-name
时知道它在哪里
在添加补丁之前,使用git apply --check $patch-name
确保没有冲突。
【讨论】:
【参考方案5】:你甚至可以只为你当前所在的子目录打补丁。只需添加.
git format-patch -k b365cce8..80a2c18a .
然后你就可以应用它们了:
git am *.patch
详情请见this answer
【讨论】:
以上是关于从 git 存储库创建补丁或差异文件并将其应用到另一个不同的 git 存储库的主要内容,如果未能解决你的问题,请参考以下文章
您如何获取 git diff 文件,并将其应用到作为同一存储库副本的本地分支?