web-dev-qa-db-ja.com

拒否されたハンクを修正した後、どのように適用しますか?

git applyを使用してファイルにパッチを適用しようとしています。パッチ全体が失敗したため、git apply --rejectを使用しました。

生成された.rejファイルを調べると、何が問題なのかがわかりました。ここで、.rejファイルの問題を修正しました。

しかし、.rejファイルを適用しようとすると、メッセージが表示されて失敗します

致命的:2行目にヘッダーのないパッチフラグメント:...

問題を修正した後、.rejファイルを再適用する方法はありますか?または、元のパッチを変更してgit applyを再実行する必要がありますか?

元のパッチには何十ものファイルのパッチが含まれており、修正されたパッチファイル全体を再[git checkout]するために適用された変更をgit applyしたくないので、これはその場合少し厄介です。

15
eckes

明確にするために @ 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通常のパッチのようなファイル。

13
drzaus

_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で適切なマクロを設定します。最もエレガントなアプローチではありませんが、うまくいきました。

4
Julian Squires

.rejファイルがあるファイルを手動で変更する方法はありません。あなたはこれを修正したと言いました。すべての.rejの問題が解決されたら、git commitの準備が整います。 git apply --rejectを使用すると、可能な場合はgit apply --rejectによってファイルが変更されるため、少し時間が節約されます。

0
cforbish