2014-03-28 19 views
5

爲什麼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和工藝替代許多例子說明它不會工作。

+0

'$ cat holla | git diff hallo'這基本上是2行命令,因此它的工作原理 –

回答

3

git diff不能用作diff的替代品。它不會在磁盤上的兩個任意文件之間進行區分,當您位於Git存儲庫之外時,您傳遞--no-index標誌時除外

$ 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是剛剛從標準輸入讀,那是如此的標準,他們不得不努力工作,使其無法工作。

至於進程替換...

$ 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是一個內容跟蹤器,它可以處理文件,而不是通用的diff工具。這個「我會在Git倉庫之外默默地進行比較差異化的工作」是那些過分靈活的設計選擇之一,只是混淆了用戶。

相關問題