为什么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
相同。
它适用于普通diff
。 cat
只是一个简单的例子,可以用非平凡的sed
表达式替换。
解决方法:
$ cat holla | git diff hallo - # works
但是如果两个参数都应该受到进程替换的影响,那么它就不会起作用,就像许多diff和进程替换的例子所描述的那样。
答案 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存储库之外的差异一样默默地工作”是那些过于灵活的设计选择之一,只会让用户感到困惑。