前两天我新建一个仓库,顺手把之前项目的 .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,才能全部看到。