恥は/dev/nullへ by 初心者

~ PC初心者による右往左往の記録 ~

Git Bash上でpatchを当てる時の改行コード

patchコマンドを今までLinux上でしか使ったことがなかったので、Windows上のGit Bashで使ってみました。

用意したサンプルファイル

sample1

1.あめ
2.さくらんぼ
3.たけのこ
4.はまち
5.まつたけ
 


sample2

1.あめ
2.かまぼこ
3.さくらんぼ
4.たけのこ
5.なす
6.はまち
 


「最終行は改行してから保存してください」とネット上に書かれていたので、2つのファイルとも、そのようにしてあります。

diffでpatchを作成

diff -u sample1 sample2 > sample.patch

diffコマンドを使って、sample.patchを作りました。

改行コードに関する疑問

パッチファイルと、パッチの適用対象の改行コードが異なるとエラーになる場合があるので、sample.patchの改行コードをLF(UNIX形式)から、CRLF(Windows形式)に変更しました。

つまり、sample1、sample2、sample.patchの全てがCRLFです。

それからパッチを当てました。

patch -u < sample.patch


以下のエラーが表示されました

patching file sample1
Hunk #1 FAILED at 1 (different line endings).
1 out of 1 hunk FAILED -- saving rejects to file sample1.rej


そこで、改行コードを変更して実験してみることにしました。

sample.patchの改行コードはLFのまま

diff -u sample1 sample2 > sample.patch

を実行した時点では、sample.patchの改行コードはLF(UNIX形式)です。
一方、sample1の改行コードはCRLF(Windows形式)です。

この状態で

patch -u < sample.patch

を実行したところ、特に問題なくパッチを当てることができました。


sample1の改行コードをLFにした

今度は、あらかじめsample1とsample2の改行コードをLF(UNIX形式)に変更しておきました。それから

diff -u sample1 sample2 > sample.patch

を実行しました。

つまり、sample1、sample2、sample.patchのの全てがLFです。

この状態で

patch -u < sample.patch

を実行したところ、特に問題なくパッチを当てることができました。

結論

sample.patchの改行コードがLFの状態でパッチを当てれば問題なさそう。
問題が生じたら、sample1とsample.patchの改行コードをLFに揃えておけば良さそう。

sample.patchの中身

以下はsample.patchの中身です。このパッチを適用することで、sample1の内容がsample2と同じになります。

sample.patchの中身

--- sample1     2025-07-16 16:30:54.649319000 +0900  
+++ sample2     2025-07-16 16:30:54.665212400 +0900  
@@ -1,6 +1,7 @@  
 1.あめ  
-2.さくらんぼ  
-3.たけのこ  
-4.はまち  
-5.まつたけ  
+2.かまぼこ  
+3.さくらんぼ  
+4.たけのこ  
+5.なす  
+6.はまち  
 


パッチを当てる前のsample1

1.あめ
2.さくらんぼ
3.たけのこ
4.はまち
5.まつたけ
 


パッチを当てた後のsample1

1.あめ
2.かまぼこ
3.さくらんぼ
4.たけのこ
5.なす
6.はまち
 


sample2(再掲)

1.あめ
2.かまぼこ
3.さくらんぼ
4.たけのこ
5.なす
6.はまち