简介
在这个实验中,你将学习如何判断一个目录是否被 Git 跟踪。你将使用 git ls-tree
命令来查看 Git 仓库的内容,以检查特定提交中的文件和目录。
此外,你将使用 git status
命令来验证仓库中文件的当前跟踪状态,并了解 Git 如何处理空目录。
在这个实验中,你将学习如何判断一个目录是否被 Git 跟踪。你将使用 git ls-tree
命令来查看 Git 仓库的内容,以检查特定提交中的文件和目录。
此外,你将使用 git status
命令来验证仓库中文件的当前跟踪状态,并了解 Git 如何处理空目录。
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 不会直接跟踪空目录,而是跟踪目录中的文件。