如何创建用于重命名文件的补丁

如何创建用于重命名文件的补丁

假设我有一个包含以下文本的文件 ( myfile.txt):

The quick brown fox jumps over the lazy dog.

我将此文件从 重命名myfile.txtmystory.txt.如何创建代表此重命名的差异?如何创建一个可以提供给它的 diffpatch以便myfile.txt重命名为mystory.txt?文件内容没有变化;仅更改文件名。

我使用的diff是 GNU diffutils 和patchGNU 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选项是必需的,因为默认情况下-rdiff使用 执行文件比较:每个文件在两个比较的目录层次结构中成对比较。如果-N省略该选项,则不匹配的文件将被列为“仅在...” ;它的内容被忽略。在这种特殊情况下,使用-N,diff发现b/myfile.txt缺少该文件,因此它a/myfile.txt与虚拟空文件进行比较,对于 也同样如此b/mystory.txt

应用此补丁将导致所需的状态,尽管不是通过重命名文件myfile.txt,而是通过删除它并创建mystory.txt

patch < story.patch

(默认情况下,patch跳过补丁中指定的路径中的第一个目录。)

相关内容