假设我有一个包含以下文本的文件 ( myfile.txt
):
The quick brown fox jumps over the lazy dog.
我将此文件从 重命名myfile.txt
为mystory.txt
.如何创建代表此重命名的差异?如何创建一个可以提供给它的 diffpatch
以便myfile.txt
重命名为mystory.txt
?文件内容没有变化;仅更改文件名。
我使用的diff
是 GNU diffutils 和patch
GNU patch。
答案1
差异-N
选项用于此目的:
-N, --new-file
treat absent files as empty
例如
$ mkdir foo
$ ls -l >foo/listing
$ cp -r foo foo2
$ mv foo2/listing foo2/listing2
$ diff -r -N foo foo2 >/tmp/diff
将生成一个列表,将“foo2/listing”显示为新文件。
命令行diff
不会将其显示为重命名,但作为补丁可以删除/添加的东西。它不会将其显示为“重命名”,因为 diff 仅比较内容文件的索引节点值(在同一文件系统上重命名时将被保留)。相反,git
(如果您使用它是重命名功能)将显示重命名。 Git
当然,可以被愚弄,但它比以下几个数量级复杂:diff
。
答案2
GNU 补丁支持 Git 风格差异的文件重命名功能,因为它的最后一个版本是 2012 年。如果你不想安装 Git,你可以自己手工制作补丁文件:
diff --git a/myfile.txt b/mystory.txt
similarity index 100%
rename from myfile.txt
rename to mystory.txt
而且效果很好:
$ ls
myfile.txt rename.patch
$ patch < rename.patch
patching file myfile.txt (renamed from mystory.txt)
$ ls
mystory.txt rename.patch
答案3
补丁不能直接代表文件重命名;重命名显示为文件删除和创建。要生成这样的补丁,您需要有两个代表原始状态和所需状态的目录:
mkdir a b
echo "The quick brown fox jumps over the lazy dog." > a/myfile.txt
cp a/myfile.txt b/mystory.txt
a
包含原始状态、b
期望状态。要生成补丁,请运行
diff -urN a b > story.patch
该-N
选项是必需的,因为默认情况下-r
,diff
使用 执行文件比较:每个文件在两个比较的目录层次结构中成对比较。如果-N
省略该选项,则不匹配的文件将被列为“仅在...” ;它的内容被忽略。在这种特殊情况下,使用-N
,diff
发现b/myfile.txt
缺少该文件,因此它a/myfile.txt
与虚拟空文件进行比较,对于 也同样如此b/mystory.txt
。
应用此补丁将导致所需的状态,尽管不是通过重命名文件myfile.txt
,而是通过删除它并创建mystory.txt
:
patch < story.patch
(默认情况下,patch
跳过补丁中指定的路径中的第一个目录。)