Gitをインストールせずに `git diff`パッチを適用する方法は?


280

クライアントはgit diffgitをインストールせずに作成したパッチをどのように適用できますか?patchコマンドを使用しようとしましたが、パッチを適用するために常にファイル名を要求します。


4
パッチに名前の変更が含まれている場合、これを行う方法を知っている人はいますか?現在、パッチはそれをネイティブでサポートしていますか?
Paul Crowley

3
問題は本当にあるはずです:gitをインストールせずにgit diffを適用する方法はありますか? 下記のようにpatchはこの形式を完全にはサポートしていません。
Aryeh Leib Taurog 2013

回答:


425
git diff > patchfile

そして

patch -p1 < patchfile

動作しますが、コメントやその他の回答で多くの人々が気づいたように、パッチは追加、削除、名前変更を理解しません。オプションはありませんがgit apply patchfile、ハンドルファイルが必要な場合は、ファイルの追加、削除、名前の変更を行います。


2015年12月を編集

patchコマンドの最新バージョン(2.7、2012年9月にリリース)は、名前の変更とコピー、権限の変更、symlinkの差分(まだバイナリの差分ではない)など、「diff --git」形式のほとんどの機能をサポートしていますリリースのお知らせ)。

したがって、現在のバージョンまたは最新バージョンpatchを使用gitする場合、その差分をパッチとして適用できるようにするために使用する必要はありません。


97
または使用git diff > patchfile、しかしpatch -p1 < patchfile
ヤクブNarębski

11
リポジトリのサブパスのパッチファイルを作成したい場合は、使用することができますrelative:のようなオプションをgit diff --no-prefix --relative=my/relative/path > patchfile
公園。

2
patch -p1 < patchfilegitをインストールする必要はありません。最初のコマンドは、diffを適用するのではなく、生成するためのコマンドを示しています。
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の回答で言ったように、最初はスラッシュを取り除きます。
Andrey Kuznetsov

75

これを試して:

patch -p1 < patchfile

4
-p1引数は何をしますか?
chrisjlee

8
ストリップは最初にスラッシュです。参照してください男パッチ
egor83

16
@chrisjleeはgit diff入れますa/b/そう、出力に接頭辞patch -p1パッチファイルを適用するために、これらを無視しています。
wberry 2013年

49

使用する

git apply patchfile

可能なら。

patch -p1 < patchfile 

潜在的な副作用があります。

git applyまた、ファイルの追加、削除、および名前の変更がgit diffフォーマットで記述されている場合、それらは処理されpatchませんが、処理されません。最後にgit apply、「すべて適用またはすべて中止」モデルで、すべてが適用されるか、何も適用されないのに対して、patchは部分的にパッチファイルを適用し、作業ディレクトリを変な状態のままにすることがあります。


1
+1、唯一の正解。さらに、diff / patchはシンボリックリンクを処理しません。これは、たとえば3.10 Linuxカーネルパッチを元に戻す場合に問題になります。
イグニス2013

10
はい、それgit applyが最善の方法ですが、この質問は特にGitをインストールせずにパッチを適用する方法を尋ねています。
コリンDベネット

1
オプション--dry-run --verboseは、副作用がある場合、それがどうなるかを決定するのに役立ちます。(パッチv2.5.8を使用)
2016

@ignis- git apply patchfile -...唯一の正気な答え...」 -それはほとんど笑えます。OpenSSL開発者がテストするパッチを送信するたびに、Gitはそれを適用できません。それは毎回です。愚かなツールがパッチを適用するのを見たことがない。
jww

8

私が使う

patch -p1 --merge < patchfile

このようにして、競合は通常どおり解決されます。


-16

これを試して:

$ git apply file.diff

29
質問を参照してください:「gitがインストールされていません」
CBベイリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.