通过 SSH 命令 Git pull 更改文件夹权限

通过 SSH 命令 Git pull 更改文件夹权限

我编写了一个自动部署脚本,它执行以下操作:

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:

  1. 从 sshd 继承的一些初始 umask。
  2. 通过 /etc/login.defs 设置的分发默认 umask。
  3. 由 PAM(pam_umask)设置。
  4. 通过运行umaskshell 内置命令的 ~/.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/- 它不会改变常规工作树文件的权限。

相关内容