git apply
を使用してファイルにパッチを適用しようとしています。パッチ全体が失敗したため、git apply --reject
を使用しました。
生成された.rej
ファイルを調べると、何が問題なのかがわかりました。ここで、.rej
ファイルの問題を修正しました。
しかし、.rej
ファイルを適用しようとすると、メッセージが表示されて失敗します
致命的:2行目にヘッダーのないパッチフラグメント:...
問題を修正した後、.rej
ファイルを再適用する方法はありますか?または、元のパッチを変更してgit apply
を再実行する必要がありますか?
元のパッチには何十ものファイルのパッチが含まれており、修正されたパッチファイル全体を再[git checkout
]するために適用された変更をgit apply
したくないので、これはその場合少し厄介です。
明確にするために @ julian-squiresが言ったこと 、問題は.rej
ファイルの間にdiff a/thefile...
および@@ -line/columns...
。
オリジナル.rej
ファイル
diff a/the/original/file.cs b/the/original/file.cs (rejected hunks) @@ -27,9 +27,9 @@ whatever was on that line
diff
行からa/bファイル名をコピーし、以下の変更インジケーターを使用してそれらを追加する必要があります。
更新.rej
ファイル
diff a/the/original/file.cs b/the/original/file.cs (rejected hunks) --- a/the/original/file.cs +++ b/the/original/file.cs @@ -27,9 +27,9 @@ whatever was on that line
次に、.rej
通常のパッチのようなファイル。
_git am --reject
_を使用して多数のパッチを適用しているときに、最近この問題が発生しました。私がそれに取り組んだ方法は、_.rej
_ファイルヘッダーをpatch(1)
が認識できるものにマッサージすることでした。
_sed -e 's/^diff a\/\(.*\) b\/\(.*\)[[:space:]].*rejected.*$/--- \1\n+++ \2/'
_
そしてそれらをemacsで変更し(パッチの変更時に_diff-mode
_がハンクの行数を更新します)、patch
で適用しました。
私のワークフローは次のようになりました:
_$ (for i in $(find . -name \*.rej); do
sed -e 's/^diff a\/\(.*\) b\/\(.*\)[[:space:]].*rejected.*$/--- \1\n+++ \2/' -i $i &&
emacsclient $i &&
patch -p0 < $i;
done) && git add -u && git clean -xdf && git am --continue
_
繰り返し発生するケースのために、emacsで適切なマクロを設定します。最もエレガントなアプローチではありませんが、うまくいきました。
.rej
ファイルがあるファイルを手動で変更する方法はありません。あなたはこれを修正したと言いました。すべての.rej
の問題が解決されたら、git commit
の準備が整います。 git apply --reject
を使用すると、可能な場合はgit apply --reject
によってファイルが変更されるため、少し時間が節約されます。