2012-03-12 255 views

回答

9

如果文件受版本控制,則跟蹤文件。

作爲一個小例子,一個C++項目將有

Makefile 
main.cpp 
interface.hpp 
worker.cpp 

作爲源文件;你會把這些放在版本控制之下。在構建期間,

main.o 
worker.o 
myapp 

被生成;這些不屬於版本控制,所以你不要在它們上使用git add。他們仍然untracked,因爲git不關心他們會發生什麼。在將它們添加到.gitignore(默認情況下忽略.o文件)之前,git不知道您是要添加還是忽略它們,因此它會使用git status命令顯示它們,直到做出決定。

是否跟蹤文件還取決於版本 - 假設您自動生成worker.cpp,並在較高版本的版本控制中將其刪除。該文件現在未在該版本中進行跟蹤。當你回到版本控制的版本時,git會在結帳時拒絕覆蓋該文件。

2

Git Pro book chapter你提到試圖詳細說明未跟蹤文件的概念:

當你籤一個給定的SHA1,你得到的所有版本的文件的「快照」。
此快照未引用的任何文件未被跟蹤。它不是的Git樹的一部分:
請參閱「git - how to tell if a file is git tracked (by shell exit code)?

要忽略必須是未經跟蹤(如本GitHub help page解釋)的任何文件。

請注意,在將規則添加到此文件忽略它之前,git不會忽略已經跟蹤的文件。
在文件必須是這樣的情況下未進行跟蹤,通常與git rm --cached filename

enter image description here

4

履帶文件是一個處理(版本控制)通過GIT中,一度被加入並致力於這一點。未被跟蹤的文件是大多數時候你不想被控制的文件,因爲例如它們是由你的編譯器生成的。

您將未跟蹤的文件添加到.gitignore文件中,以便Git不會詢問您是否要跟蹤它們。

+2

說「跟蹤文件」是曾經添加和提交過的文件是完全不正確的。被跟蹤的文件只是一個存在於索引樹中的文件 - 它如何到達那裏可能是由於分支簽出或由於添加或由於直接的Git管道命令導致的。 – Jazimov 2017-04-27 21:34:56

0

從純粹的技術角度來看:被跟蹤的文件只是一個存在於Git索引中的文件。說這是一個「版本控制下」的文件是誤導性的,因爲這表明它是一個文件,使其成爲回購 - 並不需要對文件進行跟蹤。

當你初始化一個新的Git倉庫時,索引是空的,你的工作目錄中的所有文件都是未跟蹤的。當文件被添加到索引時,文件被追蹤 - 此時爲其創建SHA-1哈希,並將對象條目放入.Git \ Objects文件夾中。從那一刻起,Git就可以比較工作目錄中同一文件的內容/名稱,以便跟蹤更改,重命名和刪除。只要文件存在於索引中,它就會被跟蹤。