【问题标题】:What are tracked files and untracked files in the context of Git?Git上下文中的跟踪文件和未跟踪文件是什么?
【发布时间】:2012-03-28 15:24:54
【问题描述】:

我是 Git 新手。我想知道什么是 trackeduntracked 文件? 我读了“Pro Git”,但还是不太明白。

有人可以通过提供一个例子向我解释两者之间的区别吗?

【问题讨论】:

    标签: git git-track git-untracked


    【解决方案1】:

    如果文件受版本控制,则跟踪该文件。

    举个小例子,一个 C++ 项目应该有

    Makefile
    main.cpp
    interface.hpp
    worker.cpp
    

    作为源文件;你会把这些置于版本控制之下。在构建期间,

    main.o
    worker.o
    myapp
    

    生成;这些不属于版本控制,因此您不要在它们上使用git add。他们仍然未跟踪,因为 git 不在乎他们会发生什么。在您将它们添加到.gitignore 之前(默认情况下忽略 .o 文件),git 不知道您是要添加还是忽略它们,因此它会使用 git status 命令显示它们,直到您做出决定。

    是否跟踪文件还取决于版本 - 假设您自动生成 worker.cpp 并在更高版本中将其从版本控制中删除。该文件现在在该版本中未跟踪。当您回到文件仍受版本控制的版本时,git 将拒绝在结帐期间覆盖该文件。

    【讨论】:

    • 我不明白为什么有人要长期处理未跟踪的文件,无论是被跟踪的还是属于 gitignore 的...... gitignore 中提到过?
    • git will refuse to overwrite that file during checkout.是什么意思
    【解决方案2】:

    跟踪的文件是由 Git 处理(版本控制)的文件,一旦添加并提交。未跟踪的文件大多数时候是您不想被控制的文件,因为例如它们是由您的编译器生成的。

    您将未跟踪的文件添加到 .gitignore 文件中,这样 Git 就不会询问您是否要跟踪它们。

    【讨论】:

    • 说“跟踪文件”是一个曾经被添加并提交的文件是完全错误的。被跟踪的文件只是存在于索引树中的文件——它是如何到达那里的,可能是由于分支检出、添加或直接 Git 管道命令。
    【解决方案3】:

    您提到的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 吗? @englealuze 也是对的,这是正确的图片链接:git-scm.com/book/en/v2/images/lifecycle.png
    • @iRestMyCaseYourHonor .gitignore 文件:我已经相应地编辑了答案。
    【解决方案4】:

    从纯技术角度来看:跟踪文件只是存在于 Git 索引中的文件。说它是“受版本控制”的文件是一种误导,因为这表明它是一个进入 repo 的文件——而这对于跟踪文件不是必需的。

    当您初始化一个新的 Git 存储库时,索引为空,并且您工作目录中的所有文件都未跟踪。一个文件在添加到索引时会被跟踪——此时会为其创建一个 SHA-1 哈希,并将一个对象条目放入 .Git\Objects 文件夹中。从那一刻起,Git 能够比较工作目录中同一文件的内容/名称,以跟踪更改、重命名和删除。只要文件存在于索引中,就会被跟踪。

    【讨论】:

      【解决方案5】:

      请记住,工作目录中的每个文件都可以处于以下两种状态之一:已跟踪或未跟踪。简而言之,被跟踪的文件是 Git 知道的文件。未跟踪的文件是其他所有文件 — 工作目录中不在上一个快照中且不在暂存区域中的任何文件。跟踪的文件是上次快照中的文件;它们可以是未修改的、修改的或暂存的

      【讨论】:

      • 您的意思是未跟踪的文件在大多数情况下往往是 wirking 树中的新文件吗?
      猜你喜欢
      • 1970-01-01
      • 2015-01-11
      • 2017-03-15
      • 2011-05-21
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 2012-12-29
      相关资源
      最近更新 更多