为什么 .gitignore 看起来像个没有名字的文件?

前两天我新建一个仓库,顺手把之前项目的 .gitignore 文件拷贝进来。然后我接了杯水,回来盯着 vscode 上的这个空项目以及这个 .gitignore 文件喝了口水,看着这个文件我突然想到,这文件名挺奇怪的。

.gitignore

如果从我们习惯的 Windows 文件名视角看,一个文件大概长这样,name.txt。点前面是名字,点后面是后缀。

.gitignore 算什么?

点前面啥也没有,后面一长串。像是没有名字,只有后缀。

我用了 Git 这么多年,从来没认真想过这个问题。为什么不叫 gitignore.txt,或者 ignore.git,偏偏要在前面挂一个点?

后来研究了一下,发现还挺有意思。

在 Unix 世界里,点没有那么强的「分隔名字和后缀」的身份。它就是文件名里的一个普通字符。README 没后缀可以,Makefile 没后缀可以,.gitignore 前面带个点也可以。

所以 .gitignore 不是「空名字 + gitignore 后缀」。

它整个名字就是 .gitignore

让这个点变得特殊的其实是终端里那个列出目录的命令,ls

早期 Unix 里,每个目录都有两个特殊入口,一个叫 .,表示当前目录。一个叫 ..,表示上一级目录。今天我们敲 cd ..,就是从这里来的。

但当时敲 ls 的时候,总能看到 ...,有点碍眼(注意是早期,现在你得 ls -a)。你只是想看目录里有哪些文件,不想每次都看到 ...。于是有工程师就想了个办法。

据贝尔实验室老工程师 Rob Pike 回忆,早期有人给 ls 加了一个判断,大概是这样,

1if (name[0] == '.') continue;

意思是,只要文件名第一个字符是点,就别显示了。

这行判断本来只是想跳过 ...。但它顺便把所有点开头的文件都隐藏了。

于是从这一行代码,衍生出了一套 dotfile 文化。

后来的程序员一看,哦,点开头的文件默认不会出现在 ls 里,这不正适合放配置吗?于是 .profile.bashrc.vimrc.ssh.config,一堆东西开始往目录里放,.gitignore 也同理。

不过现在这堆文件,你得敲 ls -a,才能全部看到。

署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
位旅人路过 次翻阅 初次见面