Cada vez que faço git pull
ou git reset
, git
redefine as alterações nas permissões e propriedade que fiz. Veja por si mesmo:
#!/usr/bin/env bash
rm -rf 1 2
mkdir 1
cd 1
git init
echo 1 > 1 && git add 1 && git ci -m 1
git clone . ../2
cd $_
chmod 0640 1
chgrp http 1
cd ../1
echo 12 > 1 && git ci -am 2
cd ../2
stat 1
git pull
stat 1
A saída:
$ ./1.sh 2>/dev/null | grep -F 'Access: ('
Access: (0640/-rw-r-----) Uid: ( 1000/ yuri) Gid: ( 33/ http)
Access: (0664/-rw-rw-r--) Uid: ( 1000/ yuri) Gid: ( 1000/ yuri)
Existe uma maneira de contornar isso?
Quero tornar alguns arquivos/diretórios acessíveis para gravação pelo servidor web.
Responder1
Parece que o usuário que você está executando tem o grupo padrão definido como yuri
. Você pode confirmar isso assim:
$ id -a
uid=1000(saml) gid=1000(saml) groups=1000(saml),10(wheel),989(wireshark)
O UID da sua conta é este: uid=1000(saml)
enquanto o grupo padrão é git=1000(saml)
e quaisquer grupos secundários são posteriores.
OBSERVAÇÃO:Se quiser que o clone do git tenha propriedade específica, você terá pelo menos duas opções.
Opção 1
Defina um diretório pai com as permissões desejadas, assim:
$ mkdir topdir
$ chgrp http topdir
$ chmod g+s topdir
$ cd topdir
$ git clone ....
Isso forçou o diretório topdir
a impor todos os diretórios filhos abaixo dele para que o grupo http
fosse aplicado. Isso funcionará em geral, mas pode causar problemas, pois se você mover arquivos para este espaço de trabalho do clone git, esses arquivos não terão seus grupos impostos pelas alterações feitas acima.
Opção 2
Antes de trabalhar, altere seu grupo padrão para http
assim:
$ newgrp http
$ git clone ...
Este método forçará todos os novos arquivos criados a terem seu grupo definido como http
em vez do grupo padrão normal de yuri
, mas isso só funcionará enquanto você se lembrar de fazer um newgrp
antes de trabalhar neste espaço de trabalho.
Outras opções
Se nada disso parecer aceitável, você pode tentar usar ACLs no diretório do espaço de trabalho git. Eles são discutidos em várias perguntas e respostas neste site, como nestas perguntas e respostas intituladas:Obtendo novos arquivos para herdar permissões de grupo no Linux.
Responder2
A solução que uso éexecute o comando como usuárioque tem as permissões que você deseja manter:
sudo -u user command
Isso evita que as permissões sejam alteradas. Eu o uso ao atualizar repositórios git no meu VPS, enquanto mantenho as permissões de arquivo definidas para o usuário do servidor web.
Veja também a mesma perguntaaqui.