「Hunk #1 FAILED at 1(別行末)」メッセージを修正するには?

「Hunk #1 FAILED at 1(別行末)」メッセージを修正するには?

次のコマンドを使用してパッチを作成しようとしています。

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

srcファイルとパッチファイルにdos2unixを適用してみましたが、メッセージは消えませんでした...

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

答え1

patchMSYS2に付属のコマンドを使用してWindowsで同じ問題が発生しました。私の場合、ソースファイルとパッチの両方にCRLF行末があり、どちらもLFに変換しても機能しませんでした。有効な方法は次のとおりです。

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

patchパッチされたすべてのファイルの行末をLFに変換するため、CRLFに変換する必要があります。

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

答え2

通常、次の方法でこの問題を解決できます。-lオプション:

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

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

しかし、OPは質問をコメントに修正しました。異なるオペレーティングシステム間でgit core.autocrlfを使用する方法Windowsのファイルで問題が発生することを示唆する例を追加しました(Unixスタイルの例とは対照的に)。patchCRLFと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処理し、行に末尾のLFがあるかどうかに応じていくつかの特別な処理を実行します。 CRへの言及はありません。それは焦点を合わせるspaceTabcheck_line_endingsただし、この情報は拒否診断を支援するためのメッセージの一部としてのみ使用されます。背面のCRを外します。pget_line--binaryこのオプションが提供されていない限り。

GNUパッチには、LFで終わるパッチをCRLFで終わる行を含むファイルに適用するようにCRLFに変換するオプションはありません。この場合、確実に使用するためのオプションは次のとおりです。

  • すべてのファイルをLFで終わるように変換するか、
  • すべてのファイルをCRLFエンディングを使用するように変換し、この--binaryオプションを追加します。

答え3

すべての解決策を試しましたが、何らかの理由で失敗しました。代わりに、パッチしようとしているファイルの行末を変更してパッチを適用してから、行末をパッチしたファイルに戻して逆の操作を実行しました。

dos2unix <file I was trying to patch>
patch <any flags you need -- I was just using -p1> < patchfile
unix2dos <file I was trying to patch>

状況によっては、反対の作業を行う必要があります。

unix2dos <file I was trying to patch>
patch <any flags you need -- I was just using -p1> < patchfile
dos2unix <file I was trying to patch>

答え4

patch私の場合、このコンピュータにインストールされたStrawberry Perlで結果が呼び出されましたが、これが最初に出ました%PATH%(そしてCygwinにはパッチがまったくインストールされませんでした)。

とにかく、パッチを作成するときに使用したもの以外のパッチバイナリを使用してパッチを適用してみました。

patchCygwinにインストールして明示的に呼び出しましたが、うまくいき/usr/bin/patchました。

関連情報