为什么`git diff`不适用于进程替换?

时间:2014-03-28 07:29:14

标签: git bash git-diff

为什么git diff无法使用流程替换?

$ echo hallo > hallo
$ echo holla > holla

$ git diff hallo holla  # works

$ git diff hallo <(cat holla)  # works not

diff --git a/hallo b/hallo
deleted file mode 100644
index 4cf5aa5..0000000
--- a/hallo
+++ /dev/null
@@ -1 +0,0 @@
-hallo
diff --git a/dev/fd/63 b/dev/fd/63
new file mode 120000
index 0000000..864a6ca`

git diff --no-index相同。

它适用于普通diffcat只是一个简单的例子,可以用非平凡的sed表达式替换。

解决方法:

$ cat holla | git diff hallo -  # works

但是如果两个参数都应该受到进程替换的影响,那么它就不会起作用,就像许多diff和进程替换的例子所描述的那样。

2 个答案:

答案 0 :(得分:8)

git diff不适用于流程替换,因为忽略了添加了流程替换处理的patch

答案 1 :(得分:3)

git diff不能用作diff的替代品。当您在Git存储库之外传递--no-index标志时,它不会在磁盘 EXCEPT 上的两个任意文件之间进行区分。

$ git diff --no-index holla hallo
diff --git a/holla b/hallo
index 5cf9d44..ba1a6c1 100644
--- a/holla
+++ b/hallo
@@ -1 +1,2 @@
-holla
+hallo
+new line

$ cat hallo | git diff --no-index holla -
diff --git a/holla b/-
index 5cf9d44..0000000 100644
--- a/holla
+++ b/-
@@ -1 +1,2 @@
-holla
+hallo
+new line

这一切都有效,因为git diff只是从STDIN读取,而且这是标准的,他们必须努力使它不起作用。

至于流程替代......

$ git diff --no-index holla <(cat hallo)
error: /dev/fd/63: unsupported file type
fatal: cannot hash /dev/fd/63

我可以解释的是,Git正在尝试在命名管道上运行其哈希算法,没有它,Git无法运行,并拒绝,因为它不是文件,它是管道。没有理由在Git存储库中有管道,因此git diff没有理由支持它们。

使用git diff替代diff是个坏主意。 Git是一个内容跟踪器,可以处理文件,而不是通用的差异工具。这个“我将像Git存储库之外的差异一样默默地工作”是那些过于灵活的设计选择之一,只会让用户感到困惑。