简述:尝试使用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
就可以解决问题。
--binary
标志。 - Parth Shah