如何在未安装Git的情况下应用git diff`补丁?


280

我的客户端如何应用git diff未安装git 的情况下创建的补丁?我尝试使用patch命令,但是它总是要求文件名打补丁。


4
如果补丁包含重命名,有人知道怎么做吗?补丁现在是否支持该功能?
Paul Crowley

3
问题应该真的是:有没有办法在没有安装git的情况下应用git diff? 如下所述patch不完全支持此格式。
Aryeh Leib Taurog

Answers:


425
git diff > patchfile

patch -p1 < patchfile

工作,但正如许多人在注释和其他答案中注意到的那样,补丁不理解添加,删除和重命名。没有其他选择,但是git apply patchfile如果您需要处理文件的添加,删除和重命名。


编辑 2015年12月

最新版本的patch命令(2.7,于2012年9月发布)支持“ diff --git”格式的大多数功能,包括重命名和副本,权限更改和symlink diff(但还没有二进制diff)(发行公告)。

因此,只要提供一个使用当前/最新版本的版本,patch就无需使用git能够将其差异作为补丁来应用。


97
或使用git diff > patchfile,但是patch -p1 < patchfile
JakubNarębski2010年

11
如果要创建存储库子路径的补丁文件,则可以使用以下relative选项:git diff --no-prefix --relative=my/relative/path > patchfile
Koen。

2
patch -p1 < patchfile不需要安装git。第一个命令演示了生成差异而不应用差异的命令。
Andrey Kuznetsov

1
生成的补丁是用于改变分支/的Refspec在命令指示当前或活动分支。换句话说,您想要git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfilegit diff from_branch to_branch > patchfile; ...
滚刀

1
@PaulChechetin正如egor83在suppie的回答中所说的,它在一开始就消除了斜线。
安德烈·库兹涅佐夫


49

采用

git apply patchfile

如果可能的话。

patch -p1 < patchfile 

有潜在的副作用。

git apply如果以git diff格式描述文件,则还可以处理文件的添加,删除和重命名,patch而不会这样做。最后,git apply是一个“全部应用或中止所有应用”模型,其中什么都不应用或什么都不应用,而补丁程序可以部分应用补丁程序文件,使工作目录处于怪异状态。


1
+1,唯一理智的答案。而且,diff / patch将不处理符号链接,如果(例如)您正在还原3.10 Linux内核补丁,这将是一个问题。
ignis 2013年

10
是的,git apply这样做是最好的方法,但是这个问题专门询问如何在未安装Git的情况下应用补丁。
Colin D Bennett

1
选项--dry-run --verbose对于确定副作用(如果有)很有用。(使用补丁v2.5.8)
spyle

@ignis- git apply patchfile -...唯一理智的答案...” -几乎是可笑的。每次OpenSSL开发人员向我发送补丁进行测试时,Git均不会应用它。那是一次。我还没有看到那个愚蠢的工具应用了补丁。
jww


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.