当我推到服务器时,git正在更改我的文件的权限

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (9)

我正在使用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 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

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

我怎么才能解决这个问题?

git服务器配置文件

[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
提问于
用户回答回答于

这是故意的。虽然git数据结构在技术上可以将Unix模式位存储在其树中,但在git历史上早期发现,除了简单的可执行位之外,尊重任何东西对于git的正常用例来说都会变得更麻烦(即,人们在存储库中存储代码或其他共享文件)。 我们可以添加一个配置选项来尊重文件模式,但是它通常被认为是不值得的。它只解决了一般元数据问题的一部分,因为它忽略了所有者和组名或ID,以及扩展的元数据(如ACL)。 如果模式对您很重要,建议的解决方案如下:

  1. 它可以从git挂钩调用,并在存储库中跟踪的文件中保存和恢复文件权限。请注意,当使用这样的工具时,在保护文件时存在一个竞争条件(即,git将创建文件为644,然后将其更正为600;同时,有人可以读取文件)。
  2. 取决于所存储的内容,可能有必要将存储库保存在另一个目录中,受权限保护,然后使用单独的工具将文件从存储库部署到它们的最终位置(例如,Makefile或其他安装工具)。

扫码关注云+社区