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は気にしなかったと思いますか?)。おそらくその特定のファイルに適用するために差分を編集できることは知っていますが、コマンドソリューションを探しています。
手動のパッチ編集や外部スクリプトを必要としないシンプルなソリューションがあります。
最初のリポジトリで(これにより、一定範囲のコミットがエクスポートされる場合があります。1つのコミットのみを選択する場合は、-1
を使用します):
git format-patch --relative <committish> --stdout > ~/patch
2番目のリポジトリ内:
git am --directory blue/red/ ~/patch
--relative
でgit format-patch
を使用する代わりに、別の解決策は、-p<n>
でgit am
オプションを使用して、パッチのパスからn
ディレクトリを削除することです。 同様の質問への回答 。
git format-patch --relative <committish>
なしで--stdout
を実行することも可能で、.patch
ファイルのセットを生成します。これらのファイルは、git am
でgit am --directory blue/red/ path/to/*.patch
に直接フィードできます。
これを行うスクリプトで自分の質問に答える: https://github.com/mprpic/apply-patch-to-file
パッチファイルを手動で変更するのではなく、ユーザーにターゲットファイルの入力を求め、パッチを変更し、現在のリポジトリに適用します。
@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
コマンドやパッチファイルの編集を必要とせずに、元のコミットメッセージなどが保持されます。
2つのファイルはあなたの状況ではまったく同じであるため、パッチは成功する可能性が高いと理解しています。
ただし、パッチを同様のファイルに適用するが、まったく同じファイルに適用しない場合、またはインタラクティブなパッチを適用する場合は、3方向マージを使用します。
ファイルA
を変更したとします。以前のバージョンとしてA~1
を指定し、A~1
からA
への差分をファイルB
に適用します。
3方向マージツールを開きます。たとえば、Beyond Compareでは、左パネルのパスはA
、中央パネルは共通の祖先なので、パスはA~1
、右パネルのパスはB
です。次に、下のパネルに、A~1
とA
の差分をFile B
に適用した結果が表示されます。
次の図はそのアイデアを示しています。