我试图使用diff创建补丁,但我无法让补丁在创建新文件时使用文件中使用的行结束字符,或者在文件更改时更改行结束字符。基本上,我在做:
cp -r dir1 dir3
diff -ruN dir1 dir2 > dir3patch.txt
cd dir3
patch -p1 < patch.txt
dir1
和dir2
之间的所有更改都适用,除了新文件的行结束字符默认为CR+LF
,即使dir2
中的文件使用LF
作为行结束标记。此外,任何文件之间的差异只是行尾的变化,都不会以任何方式修补——diff似乎没有看到任何变化。
所以运行diff -rq dir2 dir3
给出一堆Files aaa and bbb differ
,但diff -rwq dir2 dir3
工作得很好。
我在Windows XP上使用UnxUtils
的diff - GNU diffutils version 2.7
和patch 2.5
。
是否有办法使补丁中包含的新文件和更改文件保持原始文件的行结束?
这行得通:
cp -r dir1 dir3
diff --binary -ruN dir1 dir2 > dir3patch.txt
cd dir3
patch --no-backup-if-mismatch --binary -u -p1 < patch.txt
不使用--binary
标志意味着逐行解析文件,忽略EOL。由于某种原因,它不会总是干净地打补丁(给出Hunk #1 succeeded at 1 with fuzz 1.
消息),所以我不得不包括--no-backup-if-mismatch
,以防止它制作.orig
文件。-u
似乎是可选的,因为补丁会自己找出补丁类型。