Existe-t-il un moyen d'empêcher Git de modifier les autorisations et la propriété lors de l'extraction?

11

Chaque fois que je fais git pullou git reset, gitréinitialise les modifications apportées aux autorisations et à la propriété que j'ai apportées. Voir par vous-même:

#!/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

Le résultat:

$ ./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-t-il un moyen de contourner ce problème?

Je souhaite rendre certains fichiers / répertoires accessibles en écriture par le serveur Web.

x-yuri
la source

Réponses:

4

Cela ressemble à l'utilisateur que vous exécutez a le groupe par défaut défini sur yuri. Vous pouvez le confirmer comme ceci:

$ id -a
uid=1000(saml) gid=1000(saml) groups=1000(saml),10(wheel),989(wireshark)

L'UID de votre compte est le suivant: uid=1000(saml)alors que le groupe par défaut est git=1000(saml)et tous les groupes secondaires le sont par la suite.

REMARQUE: Si vous souhaitez que le clone git ait une propriété spécifique, vous avez au moins 2 options.

Option 1

Définissez un répertoire parent avec les autorisations souhaitées:

$ mkdir topdir
$ chgrp http topdir
$ chmod g+s topdir

$ cd topdir
$ git clone ....

Cela a forcé le répertoire topdirà appliquer tous les répertoires enfants en dessous pour que le groupe soit httpappliqué. Cela fonctionnera en gros mais peut entraîner des problèmes, car si vous déplacez des fichiers dans cet espace de travail de clone git, ces groupes n'auront pas leurs groupes imposés par les modifications apportées ci-dessus.

Option 2

Avant de travailler, changez votre groupe par défaut httpcomme suit:

$ newgrp http
$ git clone ...

Cette méthode forcera tous les nouveaux fichiers créés à avoir leur groupe défini à la httpplace de votre groupe par défaut normal yuri, mais cela ne fonctionnera que tant que vous vous souviendrez de faire un newgrpavant de travailler dans cet espace de travail.

Autres options

Si aucun de ces éléments ne semble acceptable, vous pouvez essayer d'utiliser des ACL à la place sur le répertoire de l'espace de travail git. Celles-ci sont discutées dans plusieurs questions et réponses sur ce site, comme dans ce Q&R intitulé: Obtenir de nouveaux fichiers pour hériter des autorisations de groupe sur Linux .

slm
la source
D'abord, vous devez avoir du sens newgrp. Ensuite, change-t-il le groupe pour le shell actuel uniquement? Enfin, il s'agissait de ne rendre accessibles que des fichiers / répertoires spécifiques pour l'écriture par le serveur Web. Après tout, je devrais probablement les réparer manuellement, ou mettre en place un gitcrochet ...
x-yuri
@ x-yuri - oui désolé il est 5h du matin ici et je suis sur le point d'aller au lit 8-). Oui, cela ne persiste que pour le shell actuel, ce serait donc un inconvénient de cette approche. Si vous ne souhaitez que certains accès au serveur Web, cela va être délicat, et vous voudrez probablement utiliser les listes de contrôle d'accès à ce moment-là. De plus, vous voudrez peut-être ajouter ces détails à votre Q. En l'état actuel des choses, le but recherché n'est pas clair, je ne peux donc vous répondre qu'en termes non spécifiques.
slm
1
@ x-yuri - un crochet de post-mise à jour comme celui-ci peut être plus approprié: stackoverflow.com/questions/9613545/…
slm
1
@ x-yuri - le contrôle des autorisations est discuté dans le livre git sous hooks: git-scm.com/book/en/Customizing-Git-Git-Hooks
slm
Pour être honnête, je ne vois pas vraiment comment changer de groupe pour le seul shell actuel peut être un inconvénient. Je craignais que cela ne change pas le fonctionnement des autres applications.
x-yuri
2

La solution que j'utilise consiste à exécuter la commande en tant qu'utilisateur disposant des autorisations que vous souhaitez conserver:

sudo -u user command

Cela empêche les autorisations de changer. Je l'utilise lors de la mise à jour des référentiels git sur mon VPS, tout en conservant les autorisations de fichier définies pour l'utilisateur du serveur Web.

Voir aussi la même question ici .

Deleet
la source