最小的dir-tree与git区分

时间:2016-05-07 11:12:39

标签: git

我试图看看我是否可以哄骗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转储。 不是非常"最小"。我可以让它在差异中跳过这个信息吗?

1 个答案:

答案 0 :(得分:1)

Git的差异旨在完全可逆,因此,任何已删除的文件都必须显示已删除的内容。使用--binary告诉Git在补丁中包含二进制文件,因此这有两个选项:

  • 省略--binary以便Git省略二进制文件和/或
  • 使用git diff(或简称--irreversible-delete)告诉-D生成不可逆差异。请注意,这会影响所有删除,而不仅仅是二进制文件。

不可逆删除选项是1.7.10版本中的新功能。

(顺便提一下,请注意--minimal只是从默认的myers diff算法切换到尝试生成较少编辑指令的算法。)