git 应用 -p(前导斜杠删除)不适用于重命名吗?



这是一个简单的差异文件git diff --no-index --no-prefix dir1 dir2 > dir.diff

diff --git dir1/file1.txt dir2/file1.txt
index 45b983b..ce01362 100644
--- dir1/file1.txt
+++ dir2/file1.txt
@@ -1 +1 @@
-hi
+hello
diff --git dir1/file2.txt dir2/file2_rename.txt
similarity index 100%
rename from dir1/file2.txt
rename to dir2/file2_rename.txt
diff --git dir1/file3.txt dir1/file3.txt
deleted file mode 100644
index b1a17ba..0000000
--- dir1/file3.txt
+++ /dev/null
@@ -1 +0,0 @@
-zzz
diff --git dir2/file4.txt dir2/file4.txt
new file mode 100644
index 0000000..f761ec1
--- /dev/null
+++ dir2/file4.txt
@@ -0,0 +1 @@
+bbb

如您所见,file1.txt 被修改,file2.txt 被重命名,file3.txt 被删除,file4.txt 被添加。

现在,当我尝试应用补丁时:

cp -r dir1 dir_work
cd dir_work
git apply -v ../dir.diff

我得到以下详细输出,表明补丁在 file2 重命名时失败:(补丁在没有 file2 的情况下完美运行)

Checking patch file1.txt...
Checking patch dir1/file2.txt => dir2/file2_rename.txt...
error: dir1/file2.txt: No such file or directory
Checking patch file3.txt...
Checking patch file4.txt...

所以对于文件1,文件3,文件4,前导目录(dir1/...dir2/...)被剥离(-p1git apply默认值),但不是为了重命名?如何剥离 file2 的前导目录?

这里的问题是检测文件重命名以及新旧名称的代码使用两行:

如您所见,

rename from dir1/file2.txt
rename to dir2/file2_rename.txt
包括dir1/dir2/部分,但不包括a/b/部分。 即使您没有在git diff命令中使用--no-prefix,这仍然是正确的。

最后,git apply-p1选项,通常只会剥离a/b/,现在正在从其他差异行中剥离dir1/dir2/,但对这两行没有任何作用。 在内部,git apply比一般情况下git apply少去一个前缀:

static int gitdiff_renamesrc(struct gitdiff_data *state,
const char *line,
struct patch *patch)
{
patch->is_rename = 1;
free(patch->old_name);
patch->old_name = find_name(state->root, line, NULL,
state->p_value ? state->p_value - 1 : 0, 0);
return 0;
}

使用没有--no-prefixgit apply -p2git diff,Git 将从这两个名称中剥离一个组件。 因此,在apply步骤中使用-p2而不是在git diff命令上使用--no-prefix可能会有所帮助。

相关内容

  • 没有找到相关文章

最新更新