因为一直使用 assh 来管理我的 ssh config,整个 SSH config 都是用 Git 仓库来管理的,但是每次一更新了 config 文件,git pull 之后 config 的文件权限都会出错:

Bad owner or permissions on /path/to/.ssh/config

发现 git 拉取的文件丢失了权限,必须通过 sudo chmod 600 ~/.ssh/config 来修改才能使用。

于是就想要了解一下 Git 仓库中怎么来管理文件权限的。

Git 只有一 bit 位来用存储文件权限

Git 只有一位用来记录权限,可执行还是不可执行。

这意味着,下面的权限是不会被 Git 追踪的:

  • 文件所有者的读写权限(write, read)
  • 文件所有者外的其他权限都不会被追踪,包括 group, other 中的 execute, write, read 权限都不会被记录

有了这个前提知识就能够解释为什么我们使用 git diff 命令的时候,Git 有些时候会显示类似如下的文件权限:

old mode 100644
new mode 100755

说明:

  • 755, owner 可以 read/write/execute, group/others 可以 read/execute
  • 644, owner 可以 read/write, group/others 只能 read

Git 会给予一个没有执行权限的文件 file mode 为 100644 ,给一个可执行的文件 100755 ,如果将文件的权限从 7xx 修改成 6xx,或者反过来(调整可执行权限),那么 Git 就会追踪到这个修改。

Git 中可以通过如下配置来忽略文件 mode

git config core.fileMode false

如果要全局忽略,可以添加 --global 参数:

git config --global core.fileMode false