在两个目录之间创建Git差异,并将补丁应用于目录。

3

我的目标是创建两个文件夹之间的差异,以便可以轻松应用文件更改。

我当前的命令:

git diff --no-index --binary 20140902/ 20141227/ > 01.diff
每个文件的差异如下所示:
diff --git a/20140902/Documents/sheet.xlsx b/20141227/Documents/sheet.xlsx
index 3d0d2c8acd53eb068ac5d390048e7f624dd012b9..fe5a87dd3b99874746e137d752fa6b151544c0ca 100644
GIT binary patch
delta 11480
...

我该如何将这个差异应用到一个名为current的文件夹,它与名为20140902的文件夹具有相同的内容(或者必要时,应用到名为20140902的文件夹)?

当我尝试运行以下命令时:

cd current/
git apply ../01.diff

我明白了

error: git diff header lacks filename information when removing 1 leading pathname component (line 3)

第3行是“GIT二进制补丁”行。也许在diff文件中,这些行应该看起来像

diff --git a/Documents/sheet.xlsx b/Documents/sheet.xlsx

?


这些文件夹中是否包含二进制文件?如果没有的话,您可以省略 --binary 标志。 - Parth Shah
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
1

简述:尝试使用git apply -p2 ...

描述

从您的帖子中,我并不完全清楚正确的设置,因此我将展示我的设置:

$ mkdir tpatch
$ cd tpatch
$ mkdir -p 20140902/Documents 20141227/Documents
$ printf 'binary\0stuff' > 20140902/Documents/foo
$ printf 'different\0binary' > 20141227/Documents/foo
$ git diff --no-index --binary 20140902/ 20141227/ > 01.diff

由于上面printf输出中有NULs,因此生成的补丁确实是一个GIT二进制补丁,尽管我的补丁有两个literal而不是delta

接下来,在目录current中创建了一个仓库。如果您的仓库在不同的级别,请使用不同的-p值:

$ mkdir current; cd current; git init
Initialized empty Git repository in .../tmp/tpatch/current/.git/
$ cp -r ../20140902/Documents .
$ ls
Documents
$ git add . && git commit -m initial
[master (root-commit) ee60bbe] initial
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 Documents/foo
请注意,此时即使使用简单的git apply命令也会出现相同的错误,因为从差异中剥离a/后,Git拥有的路径是20140902/Documents/foo而不是Documents/foo
$ git apply ../01.diff 
error: git diff header lacks filename information when removing 1 leading pathname component (line 3)
然而,使用-p2,我们告诉Git从路径中删除两个组成部分(a/20140902/),之后文件名Documents/foo与存储库和工作树中的文件名匹配。
$ git apply -p2 ../01.diff
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   Documents/foo

no changes added to commit (use "git add" and/or "git commit -a")
如果您的情况更为复杂,可能需要在首次使用 git diff 命令时使用 --src-prefix 和/或 --dst-prefix 选项,但只使用 -p2 就可以解决问题。

使用 --no-prefix 参数运行 git diff 命令,可以让默认为 -p1 的 git apply 命令大部分正常工作。但是我在重命名文件时遇到了问题。https://stackoverflow.com/questions/62858586/does-git-apply-p-leading-slash-removal-not-work-for-renames - qwr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,