web-dev-qa-db-ja.com

Gitパッチを異なる名前とパスを持つファイルに適用する方法は?

2つのリポジトリがあります。 1つでは、ファイル./hello.testを変更します。変更をコミットし、git format-patch -1 HEADを使用してそのコミットからパッチを作成します。これで、hello.testと同じ内容のファイルを含む2番目のリポジトリがありますが、別の名前の別のディレクトリに配置されます:./blue/red/hi.test。前述のパッチをhi.testファイルに適用するにはどうすればよいですか? git am --directory='blue/red' < patch_fileを試してみましたが、もちろん、ファイルの名前が同じではないという不満があります(Gitは気にしなかったと思いますか?)。おそらくその特定のファイルに適用するために差分を編集できることは知っていますが、コマンドソリューションを探しています。

81
mart1n

git diff を使用してパッチを作成してから、 patch ユーティリティを使用してパッチを適用できます。これにより、適用するファイルを指定できます。差分。

例えば:

cd first-repo
git diff HEAD^ -- hello.test > ~/patch_file

cd ../second-repo
patch -p1 blue/red/hi.test ~/patch_file
81
georgebrock

手動のパッチ編集や外部スクリプトを必要としないシンプルなソリューションがあります。

最初のリポジトリで(これにより、一定範囲のコミットがエクスポートされる場合があります。1つのコミットのみを選択する場合は、-1を使用します):

git format-patch --relative <committish> --stdout > ~/patch

2番目のリポジトリ内:

git am --directory blue/red/ ~/patch

--relativegit format-patchを使用する代わりに、別の解決策は、-p<n>git amオプションを使用して、パッチのパスからnディレクトリを削除することです。 同様の質問への回答

git format-patch --relative <committish>なしで--stdoutを実行することも可能で、.patchファイルのセットを生成します。これらのファイルは、git amgit am --directory blue/red/ path/to/*.patchに直接フィードできます。

37
magiraud

これを行うスクリプトで自分の質問に答える: https://github.com/mprpic/apply-patch-to-file

パッチファイルを手動で変更するのではなく、ユーザーにターゲットファイルの入力を求め、パッチを変更し、現在のリポジトリに適用します。

8
mart1n

@georgebrockの答えを基に、私が使用したソリューションを次に示します。

まず、通常どおりパッチファイルを作成します(例:git format-patch commitA..commitB)。

次に、ターゲットリポジトリがクリーンであることを確認し(変更または追跡されていないファイルはないはずです)、次のようなパッチを適用します。

cd second-repo
git am ~/00*.patch

パッチファイルごとに、「エラー:XYZがインデックスに存在しません」などのエラーが表示されます。これで、このパッチファイルを手動で適用できます。

patch --directory blue/red < ~/0001-*.patch
git add -a
git am --continue

パッチファイルごとにこれらの3つの手順を実行する必要があります。

これにより、特別なgit format-patchコマンドやパッチファイルの編集を必要とせずに、元のコミットメッセージなどが保持されます。

3
oliver

2つのファイルはあなたの状況ではまったく同じであるため、パッチは成功する可能性が高いと理解しています。

ただし、パッチを同様のファイルに適用するが、まったく同じファイルに適用しない場合、またはインタラクティブなパッチを適用する場合は、3方向マージを使用します。

ファイルAを変更したとします。以前のバージョンとしてA~1を指定し、A~1からAへの差分をファイルBに適用します。

3方向マージツールを開きます。たとえば、Beyond Compareでは、左パネルのパスはA、中央パネルは共通の祖先なので、パスはA~1、右パネルのパスはBです。次に、下のパネルに、A~1Aの差分をFile Bに適用した結果が表示されます。

次の図はそのアイデアを示しています。

enter image description here

0
Gqqnbig