25

我正在使用 git 来管理服务器上的网站。

我有一个如下所示的本地存储库

local@workstation:myapp$ ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}'
total 16
755 drwxr-xr-x@ 18 thomas  staff   612 Jun 13 15:35 application
755 drwxr-xr-x@ 11 thomas  staff   374 Jun 12 16:25 assets
644 -rw-r--r--@  1 thomas  staff  6399 Jun 22 11:45 index.php
755 drwxr-xr-x@ 10 thomas  staff   340 May 14 15:22 system

我在服务器上有一个裸存储库,用于将存储库post-receive指向 apache 前面。Apache 的public文件夹内容在下面——不是裸存储库。

root@server:/srv/public/myapp# ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}'
total 20
700 drwx------ 15 root root 4096 Jun 27 11:31 application
700 drwx------ 10 root root 4096 Jun 27 11:31 assets
600 -rw-------  1 root root 6399 Jun 27 11:31 index.php
700 drwx------  8 root root 4096 Jun 27 11:31 system

这对我在网络服务器上的代码造成了混乱。

我怎样才能解决这个问题?如果这有什么不同,我正在使用 gitolite。

git 服务器配置文件

[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
4

2 回答 2

35

这个帖子提供了一个很好的解释:

这是设计使然。虽然 git 数据结构在技术上可以在其树中存储 unix 模式位,但在 git 的早期历史中发现,除了简单的可执行位之外,尊重任何东西对于 git 的正常用例(即人们存储代码或其他共享存储库中的文件)。

我们可以添加一个配置选项来尊重文件模式,但通常被认为不值得。它只解决了一般元数据问题的一部分,因为它省略了所有者和组名称或 ID,以及 ACL 等扩展元数据。

如果模式对您很重要,建议的修复是以下之一:

  1. 使用可以从 git 挂钩调用的“metastore”之类的工具,并将在存储库中跟踪的文件中保存和恢复文件权限。请注意,当使用此类工具时,在保护文件时存在竞争条件(即,git 会将您的文件创建为 644,然后 Metastore 会将其更正为 600;与此同时,有人可以读取您的文件)。

  2. 根据您要存储的确切内容,将存储库保存在另一个目录中并受权限保护可能有意义,然后使用单独的工具将文件从存储库部署到其最终位置(例如,Makefile 或其他安装工具)。

于 2012-06-27T17:16:23.873 回答
1

为了扩展 @ThomasReggi 的评论,作为通过 git 部署时更改权限问题的解决方案,我留下了我实现的解决方案。您可以在 hooks / post-receive 文件(或您正在使用的任何挂钩)中添加命令

在使用 git 命令的行之前 --work-tree =(执行部署的行)添加一些“echo”和当前 umask 的显示,设置正确执行部署所需的 umask 并再次显示当前 umask 以确认更改。(这样在执行部署时可以看到(调试))

echo "Ref $ ref received. Deploying $ {BRANCH} branch to production ..."
# SHOW current uMask
echo "Current uMASK:"
umask
echo "Set uMASK to 0022"
umask 0022
echo "New uMASK seted to ..."
umask
echo "end umask conf"

# deploy
HUB_VERBOSE = 1
git --work-tree = $ TARGET --git-dir = $ GIT_DIR checkout -f

这样 umask 只会针对当前会话进行更改,而不会影响其余的 ssh 连接。并且文件在创建/修改时使用必要的权限进行部署,而不是在部署后使用命令重新设置必要的权限,从而导致您的应用程序在应用适当权限期间失败。

如果您的权限问题影响了您的 php 应用程序,那么这个问题似乎与您运行 php(DSO、suPHP、suEXEC)的方式有关,因为它们中的每一个都需要不同的权限设置才能正确运行。如果您从服务器迁移,或更改了 php 处理程序,那么您将遇到此问题。

于 2020-09-14T19:18:42.130 回答