コミットのリストをパッチとして取得し、パッチを取得したいプロジェクトに非常に近いプロジェクトを保存した別のリポジトリにそれらを適用したいと思います。1 つのコマンドですべてのパッチを取得するにはどうすればよいですか? git format-patch と git log -p の間の最良の方法 (および違い) は何ですか?
3 に答える
git log -p時系列の逆順(最新のものが最初)の変更を示します。これは通常、パッチの生成には適していません。最新の変更ではなく、最も早い変更でパッチを適用し始めたいからです。
git format-patch正しい方向にパッチを生成し(パッチが最も早い変更になります)、パッチをファイルごとに1つ保存し、受信側での0001使用に適した電子メールメッセージとしてフォーマットします。git am
git format-patchしたがって、必要な場合は、 1つのリポジトリで実行してgit amから、ターゲットリポジトリで実行するのがおそらく最も理にかなっています。
cat *.patch | git am
git bundleコマンドを使用してバイナリアーカイブを作成し、それをリポジトリの別のコピーに適用することもできると思います。
ただし、このアプローチはgit format-patchandを使用するよりも柔軟ではgit amありませんが、各パッチを手動で確認したくない場合は、より迅速になる可能性があります。
git bundle create file.name revision..list— 現在のフォルダーにファイルを作成しfile.name、指定されたリビジョンの内容をその中に入れます。
git bundle unbundle file.nameリビジョンを別の場所に復元します。
パスの番号の先頭に「-」記号を付けて git log から生成されたハッシュをフォーマットすると、すべてのパッチを異なるファイルに一度に生成できます。例:
git format-patch $(git log --reverse 073dd505f..fff28ff65 --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')
これにより、git log から適用できるすべてのフィルターがカバーされます。それらは常に連続したコミットではありません。たとえば、特定のユーザーに対応するパッチを取得します。
git format-patch $(git log --reverse --author="John Doe" --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')
--reverse オプションは、パッチを時系列で提供するために必要です。git log は最新のものを最初に提供するためです。