web-dev-qa-db-ja.com

「Hunk#1 FAILED at 1(different line endings)」メッセージを修正する方法

コマンドでパッチを作成しようとしています

git diff sourcefile >/var/lib/laymab/overlay/category/ebuild/files/thepatch.patch

パッチを適用すると、

$ patch -v
GNU patch 2.7.5

$ /usr/bin/patch -p1 </var/lib/laymab/overlay/category/ebuild/files/thepatch.patch
patching file sourcefile
Hunk #1 FAILED at 1 (different line endings).
Hunk #2 FAILED at 23 (different line endings).
Hunk #3 FAILED at 47 (different line endings).
Hunk #4 FAILED at 65 (different line endings).
Hunk #5 FAILED at 361 (different line endings).
5 out of 5 hunks FAILED -- saving rejects to file sourcefile.rej

Dos2unixをsrcファイルとパッチファイルの両方に適用しようとしましたが、メッセージが消えません...

UPD:--ignore-whitespaceも役に立ちません

PATCH COMMAND:  patch -p1 -g0 -E --no-backup-if-mismatch --ignore-whitespace --dry-run -f < '/var/lib/layman/dotnet/dev-dotnet/slntools/files/remove-wix-project-from-sln-file-v2.patch'

=====================================================
checking file Main/SLNTools.sln
Hunk #1 FAILED at 14 (different line endings).
Hunk #2 FAILED at 49 (different line endings).
Hunk #3 FAILED at 69 (different line endings).
Hunk #4 FAILED at 102 (different line endings).
4 out of 4 hunks FAILED

UPD:非常に良い記事を見つけました: https://stackoverflow.com/a/4425433/1709408

23
user1709408

WindowsのMSYS2に付属するpatchcommandを使用しても同じ問題が発生しました。私の場合、ソースファイルとパッチの両方でCRLFの行末があり、両方をLFに変換しても機能しませんでした。機能したのは次のとおりです。

$ dos2unix patch-file.patch
$ patch -p1 < patch-file.patch
$ unix2dos modified-files...

patchは、パッチを適用したすべてのファイルで行末をLFに変換するため、CRLFに変換し直す必要があります。

Obs:私が使用しているpatchバージョンは2.7.5です

通常、 -lオプション を使用してこれを回避できます。

-lまたは--ignore-whitespaceオプションを使用します。これにより、パッチは空白文字(つまり、スペースとタブ)を緩く比較し、パッチファイル内の空でない空白のシーケンスが入力ファイル内の空でない空白のシーケンスと一致するようにします。

これは標準機能です( POSIXパッチ の説明を参照)。

ただし、OPはのオペレーティングシステム間でgit core.autocrlfを使用して行末変換がどのように機能するかについてコメントする質問を修正しましたそして、問題がWindows上のファイルで見られることを示唆する例を追加しました(Unixスタイルの例とは対照的です)。 patchは、CRLFとLFの行末の不一致に対応しようとしますが、後者が使用されていると推定する傾向があります。パッチファイルにCRLFの終了があった場合、パッチを適用するファイルはそうしませんでした。この例のログのように回復します:

(Stripping trailing CRs from patch.)
patching file xterm.log.html
(Stripping trailing CRs from patch.)
patching file xterm.man
(Stripping trailing CRs from patch.)
patching file xtermcfg.hin

similar 関数でソースコードをチェックすると、GNU patchは空白を次のように扱います space そして Tab、行に末尾のLFがあるかどうかに応じて、特別な処理を行います。 CRは言及されていません。 check_line_endings で注意を払いますが、拒否の診断に役立つメッセージの一部としてのみその情報を使用します。 --binaryオプションが指定されていない限り、 pget_line の末尾のCRを削除します。

GNUパッチには、LFで終わるパッチをCRLFに変換して、行末がCRLFであるファイルに適用するように指示するオプションはありません。この場合に確実に使用するには、次の選択肢があります。

  • すべてのファイルを変換して使用するLF末尾、または
  • cRLFの末尾を使用するようにすべてのファイルを変換し、--binaryオプションを追加します。
5
Thomas Dickey

Cygwinでも同様の問題がありました。私の場合、修正はstdinから読み取る代わりに-iフラグを使用することでした。

以下は別の行末エラーで失敗しました:

patch -t -N -r - -p0 < patchfile

しかし、以下は成功しました:

patch -t -N -r - -p0 -i patchfile

原因は不明ですが、誰かが同じ問題を抱えている場合に備えて、ここに残しておきます。

0
Joe