我编写了一个自动部署脚本,它执行以下操作:
ssh [email protected] "cd domains/domain.com && git reset --hard && git pull --no-rebase"
由于某种原因,它弄乱了 css 文件夹的文件夹权限。如果我运行此命令,权限将被设置为 700,而不是应有的 755。
但是,当第一次手动登录 SSH,然后在那里执行命令时:
ssh [email protected]
cd domains/domain.com
git reset --hard
git pull --no-rebase
文件夹权限正确!
值得注意的是,这个错误似乎是在服务器更新到 git 版本 2.27.0 时出现的
为什么是这样?
答案1
通常,git
让操作系统决定文件权限(Git 跟踪的 +x 除外)——新文件是否可供所有人读取通常取决于umask为当前进程设置的。
当你登录时,可以在几个地方设置 umask:
- 从 sshd 继承的一些初始 umask。
- 通过 /etc/login.defs 设置的分发默认 umask。
- 由 PAM(pam_umask)设置。
- 通过运行
umask
shell 内置命令的 ~/.bashrc 或 ~/.profile 进行设置。
但是,当您以“批处理模式”运行 SSH 时 - 具体来说,当 SSH 服务器以“批处理模式”运行您的 shell 时 - 通常会跳过步骤 3,因此 PAM 设置的 umask 将保留,而 ~/.profile 中的 umask 根本不会设置。
umask
因此,首先比较通过 SSH 交互运行的结果与实际运行的结果,ssh user@host "umask"
看看它们是否不同。(您想要的结果是“0022”,因为它表示应该删除哪些位。)
还可以使用以下方法设置每个目录的默认权限默认 ACL– 运行getfacl
目录以查看这些内容。查找类似 的项目default:user::
。
只有一个有点相关的 git 设置 - core.sharedRepository
,但它实际上只会影响 Git 内部文件(即目录中的内容)的权限.git/
- 它不会改变常规工作树文件的权限。