如何检查目录是否被 Git 跟踪

GitGitBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何判断一个目录是否被 Git 跟踪。你将使用 git ls-tree 命令来查看 Git 仓库的内容,以检查特定提交中的文件和目录。

此外,你将使用 git status 命令来验证仓库中文件的当前跟踪状态,并了解 Git 如何处理空目录。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/SetupandConfigGroup(["Setup and Config"]) git/SetupandConfigGroup -.-> git/git("Show Version") git/BasicOperationsGroup -.-> git/status("Check Status") subgraph Lab Skills git/git -.-> lab-560020{{"如何检查目录是否被 Git 跟踪"}} git/status -.-> lab-560020{{"如何检查目录是否被 Git 跟踪"}} end

对目录运行 git ls-tree 命令

在这一步中,你将使用 git ls-tree 命令来查看 Git 仓库的内容。该命令可以让你查看树对象(tree object)的内容,树对象代表了特定提交时目录的状态。

首先,确保你位于 my-time-machine 目录中:

cd ~/project/my-time-machine

现在,让我们使用 git ls-tree 命令来查看最新提交的内容。你可以使用 HEAD 来指代最新提交:

git ls-tree HEAD

你应该会看到类似以下的输出:

100644 blob a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9	message.txt

让我们来分析一下这个输出:

  • 100644:这是文件模式,表示它是一个普通文件。
  • blob:这表示对象的类型。blob 对象存储文件的内容。
  • a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9:这是存储 message.txt 内容的 blob 对象的唯一标识符(SHA-1 哈希值)。你的哈希值会有所不同。
  • message.txt:这是文件的名称。

git ls-tree 命令对于在不检出整个提交的情况下检查特定提交的内容非常有用。它会显示在那个时间点被 Git 跟踪的文件和目录。

你可以把它想象成打开一个特定的时间胶囊(提交),确切地查看其中包含哪些文件以及它们的唯一指纹(blob 哈希值)是什么。这是一种了解项目历史结构和内容的强大方法。

使用 git status 验证跟踪状态

在前面的步骤中,你创建了一个文件并将其提交到了 Git 仓库。现在,让我们再次使用 git status 命令来查看仓库的当前状态,并确认文件已被跟踪。

确保你仍然位于 ~/project/my-time-machine 目录中:

cd ~/project/my-time-machine

现在,运行 git status 命令:

git status

你应该会看到类似以下的输出:

On branch master
nothing to commit, working tree clean

这个输出传达了几个重要信息:

  • On branch master:你当前位于 master 分支,这是项目的主时间线。
  • nothing to commit, working tree clean:这是关键部分。它意味着工作目录中没有尚未提交的更改。Git 正在跟踪所有应该跟踪的文件,并且没有需要添加或提交的新文件或修改过的文件。

这是你完成更改并提交后的理想状态。它确认了 Git 知晓项目的当前状态,并且仓库中的所有内容都是最新的。

将这个输出与创建并提交 message.txt 之前的 git status 输出进行对比,可以突出显示空仓库、包含未跟踪文件的仓库以及包含已跟踪文件的干净仓库之间的差异。

理解 git status 至关重要,因为它是你了解仓库中情况以及确定需要采取何种操作(如添加或提交文件)的主要工具。

测试空目录

在这一步中,你将探究 Git 如何处理空目录。这是初学者常见的困惑点,因为 Git 处理目录的方式与处理文件不同。

首先,确保你位于 ~/project/my-time-machine 目录中:

cd ~/project/my-time-machine

现在,让我们在项目中创建一个新的空目录:

mkdir empty-folder

你已经创建了这个目录。现在,使用 git status 命令检查仓库的状态:

git status

你应该会看到类似以下的输出:

On branch master
nothing to commit, working tree clean

注意,Git 不会empty-folder 报告为未跟踪的目录。这是因为 Git 跟踪的是文件内容,而不是目录本身。空目录没有可跟踪的内容。

这是 Git 中的一个重要概念。如果你需要将空目录包含在仓库中,常见的解决方法是在其中放置一个占位文件。常见的做法是创建一个名为 .gitkeep 的文件(虽然文件名并不重要,这只是一种约定)。

让我们在 empty-folder 中创建一个 .gitkeep 文件:

touch empty-folder/.gitkeep

现在,再次检查 git status

git status

这次,你应该会看到:

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	untracked files present (use "git add" to track)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	empty-folder/

现在,Git 能识别到 empty-folder/ 了,因为它包含了一个可跟踪的文件(.gitkeep)。

这表明 Git 跟踪的是目录中文件的存在,而不是目录本身。要将一个目录纳入仓库的历史记录,它必须至少包含一个被跟踪的文件。

总结

在本次实验中,你学习了如何检查目录及其内容是否被 Git 跟踪。你使用 git ls-tree HEAD 命令检查了最新提交的内容,了解到该命令会显示被跟踪的文件及其关联的对象(blob)和哈希值。这个命令能提供仓库在特定提交时的状态快照。

你还使用 git status 命令验证了仓库中文件的当前跟踪状态,确认了已提交的文件确实被 Git 跟踪。最后,你探究了 Git 如何处理空目录,发现 Git 不会直接跟踪空目录,而是跟踪目录中的文件。