gitリポジトリからパッチまたはdiffファイルを作成し、別の異なるgitリポジトリに適用する


155

WordPressベースのプロジェクトで作業していて、WPの新しいリリースバージョンごとにプロジェクトにパッチを適用したい。このため、2つのコミットまたはタグの間にパッチを生成します。

たとえば、私のリポジトリ/www/WPではこれを行います:

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

または

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP git natifワードプレス

/www/myproject 私のGitプロジェクトWordPressベース

git applyコマンドラインは、我々は異なるリポジトリにあるので、私は考えて、動作しません。

コミットせずに差分だけでパッチファイルを生成し、それを別のgitリポジトリに適用できますか?

よろしくお願いします。

回答:


243

を使用git diffして、以下に適した統合されたdiffを生成できますgit apply

git diff tag1..tag2 > mypatch.patch

次に、次のようにして得られたパッチを適用できます。

git apply mypatch.patch

1
あなたはエンリコ、私が使用ありがとう$git diff -u tag1..tag2 > mypatch.patch$git apply --stat > mypatch.patch答えは、0 files changed他のどの提案してください?:)
ザタミン2015年

の引数としてパッチファイルへのパスを指定する必要がありますgit apply。例を挙げて回答を更新しました。
エンリコカンピドリオ2015年

1
git diff -p tag1 tag2 > my.patchはうまくいったものを使用しました。
バークレー

統一されたdiff形式でパッチを作成するにはどうすればよいですか?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>...]
アーロンフランケ

2
注意してくださいgit diff ...+ git apply ...ない削除扱う/移動したファイルが正常に...ときでくださいgit format-patch ...+ git am ...ください。
vrince

50

複数のコミットのパッチを作成するには、format-patchgitコマンドを使用する必要があります。例:

git format-patch -k --stdout R1..R2

これにより、コミットがメールボックス形式のパッチファイルにエクスポートされます。

最後のコミットのパッチを生成するには、次のコマンドを実行します。

git format-patch -k --stdout HEAD^

次に、別のリポジトリでamgitコマンドでパッチを適用します。例:

git am -3 -k file.patch

参照:man git-format-patchgit-am


1
で適用できるパッチはどうpatch -p1ですか?sourceware.org/glibc/wiki/...
アーロンフランケ

ここに述べたように、私はwinodwsにLinuxからのパッチを動いていたので、--ignore-空白を使用していたstackoverflow.com/questions/13190679/...
マヘシュ

2
@AaronFranke、 '-p'オプションを試すことができます:git format-patch -p HEAD ^ 1
Piroxiljin

注目すべきことに、これには、元のコミットのコミットメッセージ、作成者、およびコミット日付を保持するという利点があります。
M.ジャスティン

0

補足として、1つの特定のコミットのみのパッチを作成するには、次のコマンドを使用します。

git format-patch -1 <sha>

パッチファイルが生成されたら、他のリポジトリが使用する場所を知っていることを確認してください。 git am ${patch-name}

パッチを追加する前に、を使用git apply --check ${patch-name}して競合がないことを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.