コマンドでパッチを作成しようとしています
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
WindowsのMSYS2に付属するpatch
commandを使用しても同じ問題が発生しました。私の場合、ソースファイルとパッチの両方で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であるファイルに適用するように指示するオプションはありません。この場合に確実に使用するには、次の選択肢があります。
--binary
オプションを追加します。Cygwinでも同様の問題がありました。私の場合、修正はstdinから読み取る代わりに-i
フラグを使用することでした。
以下は別の行末エラーで失敗しました:
patch -t -N -r - -p0 < patchfile
しかし、以下は成功しました:
patch -t -N -r - -p0 -i patchfile
原因は不明ですが、誰かが同じ問題を抱えている場合に備えて、ここに残しておきます。