8

で生成されたパッチのファイル(すべてが単一のファイルに適用されます)があります

git log -p file-of-interest.txt >patches.txt

これらのパッチを別のレポに適用したいのですが、試してみると

git am patches.txt

「パッチ形式の検出に失敗しました」というエラー メッセージが表示されます。

git applyどちらも機能しません)。これらのパッチを適用する正しい方法はどれですか?

編集: 私がやりたいことは、2 つのコミット間の 1 つのファイルへのすべての変更を一連のパッチに抽出し、それらの変更を別のリポジトリに適用することです。git log -p from..to -- the-file差分を生成します。からパッチを適用できない場合、git log(format-patchまたは別のコマンドで) 1 つのファイルのみにパッチを生成することはできますか?

4

4 に答える 4

13

パッチを個々のパッチに分割する必要があります。git log -p出力から手動でそれを行い、それを使用git applyして順番に適用することができます。git log -p出力は実際にはgit処理するためのものではありませんでした...

しかし、より良いオプションは、 を使用git format-patchして一連のパッチ ファイルを作成し (手動で分割する必要はありません)、 を使用git amしてそれらをすべて一度に適用することです...

git format-patch -o <output_directory> <from_revision>..<to_revision> -- file-of-interest.txt

また、git am電子メール形式のパッチが必要であることに注意してください ( git format-patch「パッチ形式の検出に失敗しました」というメッセージが表示される理由は、によって生成されたものなど)。diffまたはで生成されたパッチは、 ではなくgit diffで適用する必要があります。ただし、/ワークフローはより柔軟で、一般的により堅牢です。git applygit amgit format-patchgit am

于 2013-01-29T21:39:57.500 に答える
1

パスの番号の先頭に「-」記号を付けて 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 は最新のものを最初に提供するためです。

于 2016-05-16T14:57:58.413 に答える
0

git log はそのようにパッチ ファイルを生成しません。git log を使用して比較するコミット番号を見つけ、代わりに git diff を使用します。

git diff 073dd505f fff28ff65 > changes.patch
于 2013-01-29T21:43:37.313 に答える