我试图看看我是否可以哄骗git来区分普通目录树(不涉及所有与提交相关的东西):
#!/bin/bash -ex
olddir=${1%/}
newdir=${2%/}
patch=$3
: "${patch:=$newdir--$olddir.gdiff}"
export GIT_DIR GIT_WORK_TREE
trap 'rm -rf "$tmpd"' EXIT
tmpd="$(mktemp -d)"
GIT_DIR="$tmpd"
git init --bare
GIT_WORK_TREE="$olddir"; git add -A .; t0="$(git write-tree)"
GIT_WORK_TREE="$newdir"; git add -A .; t1="$(git write-tree)"
#git diff-tree --minimal "$t0" "$t1"
git diff-tree --patch --binary --minimal "$t0" "$t1" > "$patch"
该脚本可以工作,但是有什么问题让我知道如果新的树删除了一个大的二进制文件,差异就会说:
deleted file mode 100644
index a4cb08553c82100cd473bf9fcbbf4232038838dd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 250585
然后继续包含整个已删除文件的 ASCII转储。 不是非常"最小"。我可以让它在差异中跳过这个信息吗?
答案 0 :(得分:1)
Git的差异旨在完全可逆,因此,任何已删除的文件都必须显示已删除的内容。使用--binary
告诉Git在补丁中包含二进制文件,因此这有两个选项:
--binary
以便Git省略二进制文件和/或git diff
(或简称--irreversible-delete
)告诉-D
生成不可逆差异。请注意,这会影响所有删除,而不仅仅是二进制文件。不可逆删除选项是1.7.10版本中的新功能。
(顺便提一下,请注意--minimal
只是从默认的myers
diff算法切换到尝试生成较少编辑指令的算法。)