2012-03-12 411 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就可以比较工作目录中同一文件的内容/名称,以便跟踪更改,重命名和删除。只要文件存在于索引中,它就会被跟踪。