2017-09-13 112 views
3

我有一箇舊提交A.我現在處於提交B = HEAD!= A狀態,並且想要將我的工作目錄的狀態(包括未跟蹤文件)與A進行比較。git diff相對於包含未跟蹤文件的工作樹

原因是當前未跟蹤的文件是承諾A的一部分,所以它們不會顯示在內,因此不會混淆我所需的差異。

作爲一種解決方法,我可以在diff之前手動git add <all the untracked files>以及git reset <all the untracked files>之後。但是,有許多未跟蹤的文件,我想以最大限度的原子和強大的方式執行此操作,因爲我正在腳本中完成所有這些操作。

編輯:This question也涉及diff與未跟蹤的文件。但是,那裏的答案需要手動添加並隨後刪除未跟蹤的文件,而且我更喜歡一個更自動地以原子方式執行此操作的解決方案,該方法可以防止腳本上下文中的中斷。被接受的答案完全是這樣,並且確實與對相關問題的答案不同。

+1

可能的重複[我可以在未跟蹤的文件上使用git diff?](https://stackoverflow.com/questions/855767/can-i-use-git-diff-on-untracked-files) –

+0

那麼' git add -N。; git diff HEAD..HEAD〜1'? –

+0

@SajibKhan:其實,事實證明,工程(所以我刪除評論)。但是對於這個特定的目的(腳本)有一個更好的方法。 – torek

回答

3

正如其他人所建議的,您可以使用git add -N向該索引添加虛擬條目。跑步:

git diff <hash> 

來比較給定當前的工作樹,利用現有的指數(現在有條目未跟蹤文件),以決定哪些工作樹的版本進行比較,以給定的<hash><hash>可能是提交ID,樹ID或分支名稱,或Git可以解析爲樹的任何東西)。但是,這確實惹的索引,如你所說,你:

想這樣做的最大的原子和穩健的方式

的技巧是使用,取而代之的是,臨時索引。

此處的初始提交文件爲barfoo;第二次提交文件foo已刪除。當前工作樹有foo復活,並有一個新文件,如git status --short所示。

$ git log --all --decorate --oneline --graph 
* 11b241c (HEAD -> master) remove foo 
* 8527327 initial 
$ git status --short 
A diffscript 
A foo 

注意,最初的承諾是8527327,這就是我們傳遞給diffscript作爲參數:

$ ./diffscript 8527327 
diff --git a/diffscript b/diffscript 
new file mode 100755 
index 0000000..8d5c978 
--- /dev/null 
+++ b/diffscript 
@@ -0,0 +1,6 @@ 
+#! /bin/sh 
+export GIT_INDEX_FILE=$(mktemp) || exit 
+rm -f $GIT_INDEX_FILE 
+trap "rm -f $GIT_INDEX_FILE" 0 1 2 3 15 
+git add -A 
+git diff ${1:-HEAD} 
index 3ec370c..d319048 100644 
--- a/foo 
+++ b/foo 
@@ -1 +1 @@ 
-I am a foo 
+I was foo, am now resurrected 

diffscript默認版本比較反對HEAD。因此,如果我們不帶參數運行它,我們會commmit 11b241c比較索引/工作樹(因爲我們git add -A大多不要緊,我們是否比較指數或工作樹,在這一點:他們基本上是相同的,模.gitignore指令)。

trap ...行確保我們刪除臨時索引,腳本是否被^ C(信號2,SIGINT)或網絡斷開連接(信號1,SIGHUP)或QUIT(信號3,SIGQUIT)終止或TERMINATE(信號15,SIGTERM)或正常退出(0,不是信號,只是正常終止)。令人煩惱的是,Git堅持認爲該文件根本不存在,或者有一個索引文件簽名 - 一個空文件是不允許的 - 所以我們刪除臨時文件mktemp使,這樣git add步驟可以創建它與正確的簽名。

+0

我不明白這一點。該'diffscript'只是增加了一切的索引,然後讓它留在那裏 – Bananach

+1

注意行'GIT_INDEX_FILE = $(mktemp的)|| exit'。它不使用* *索引,它使用一些* other *索引,我們在完成時刪除它。 * *指數保持不變!但是,需要一個錯誤修復:'export'! (我沒有正確測試) – torek

+0

啊,對,我沒有意識到GIT_INDEX_FILE具有的功能。但是現在我得到的「索引文件比預期的要小」 – Bananach

1

你可以看看:

git add --intent-to-add(同git add -N

這隻會追加一個空的條目索引,而不是文件本身。使用diff命令時會看到差異。

GIT文件:

--intent到添加

這是有用的,除其他事項外,顯示此類文件的未分級內容 與git的差異,並與他們犯git commit -a。>僅記錄路徑將在稍後添加的事實。 的條目放置在沒有內容的索引中。

+0

進入了正確的方向,而不是自動和原子如我所願。 (需要添加所有未跟蹤文件,記住他們,稍後再重新設置) – Bananach

相關問題