【发布时间】:2012-03-28 15:24:54
【问题描述】:
我是 Git 新手。我想知道什么是 tracked 和 untracked 文件? 我读了“Pro Git”,但还是不太明白。
有人可以通过提供一个例子向我解释两者之间的区别吗?
【问题讨论】:
标签: git git-track git-untracked
我是 Git 新手。我想知道什么是 tracked 和 untracked 文件? 我读了“Pro Git”,但还是不太明白。
有人可以通过提供一个例子向我解释两者之间的区别吗?
【问题讨论】:
标签: git git-track git-untracked
如果文件受版本控制,则跟踪该文件。
举个小例子,一个 C++ 项目应该有
Makefile
main.cpp
interface.hpp
worker.cpp
作为源文件;你会把这些置于版本控制之下。在构建期间,
main.o
worker.o
myapp
生成;这些不属于版本控制,因此您不要在它们上使用git add。他们仍然未跟踪,因为 git 不在乎他们会发生什么。在您将它们添加到.gitignore 之前(默认情况下忽略 .o 文件),git 不知道您是要添加还是忽略它们,因此它会使用 git status 命令显示它们,直到您做出决定。
是否跟踪文件还取决于版本 - 假设您自动生成 worker.cpp 并在更高版本中将其从版本控制中删除。该文件现在在该版本中未跟踪。当您回到文件仍受版本控制的版本时,git 将拒绝在结帐期间覆盖该文件。
【讨论】:
git will refuse to overwrite that file during checkout.是什么意思
跟踪的文件是由 Git 处理(版本控制)的文件,一旦添加并提交。未跟踪的文件大多数时候是您不想被控制的文件,因为例如它们是由您的编译器生成的。
您将未跟踪的文件添加到 .gitignore 文件中,这样 Git 就不会询问您是否要跟踪它们。
【讨论】:
您提到的Git Pro book chapter 试图详细说明未跟踪文件的概念:
当您签出给定的 SHA1 时,您会获得所有版本化文件的“快照”。
此快照未引用的任何文件都不会被跟踪。它不是 Git 树的一部分:
见“git - how to tell if a file is git tracked (by shell exit code)?”
您要忽略的任何文件都必须是未跟踪的(如GitHub help page 中所述)。
请注意,在将规则添加到
.gitignore文件以忽略它之前,git 不会忽略已经跟踪的文件。
在这种情况下,必须取消跟踪文件,通常使用git rm --cached filename
【讨论】:
.gitignore 文件:我已经相应地编辑了答案。
从纯技术角度来看:跟踪文件只是存在于 Git 索引中的文件。说它是“受版本控制”的文件是一种误导,因为这表明它是一个进入 repo 的文件——而这对于跟踪文件不是必需的。
当您初始化一个新的 Git 存储库时,索引为空,并且您工作目录中的所有文件都未跟踪。一个文件在添加到索引时会被跟踪——此时会为其创建一个 SHA-1 哈希,并将一个对象条目放入 .Git\Objects 文件夹中。从那一刻起,Git 能够比较工作目录中同一文件的内容/名称,以跟踪更改、重命名和删除。只要文件存在于索引中,就会被跟踪。
【讨论】:
请记住,工作目录中的每个文件都可以处于以下两种状态之一:已跟踪或未跟踪。简而言之,被跟踪的文件是 Git 知道的文件。未跟踪的文件是其他所有文件 — 工作目录中不在上一个快照中且不在暂存区域中的任何文件。跟踪的文件是上次快照中的文件;它们可以是未修改的、修改的或暂存的
【讨论】: