Git pull dans un environnement Linux change le propriétaire des fichiers

12

Pourquoi chaque fois que j'exécute un git pullsur mon serveur en direct, le propriétaire des fichiers est changé? Je continue de faire manuellement un chown john:john index.php.

Que dois-je changer pour que, lorsque je le fais git pull, le propriétaire des fichiers soit automatiquement ou reste john?

PinoyStackOverflower
la source
1
Le johnpropriétaire du répertoire actuel est-il?
user000001
Oui, John est le propriétaire de l'annuaire :)
PinoyStackOverflower
1
Quel utilisateur fonctionne git pull?
cuonglm
@Gnouc root user, je suis connecté sur notre serveur live via SSH en tant qu'utilisateur root :)
PinoyStackOverflower

Réponses:

11

Lorsque vous utilisez git pull(ce qui équivaut à git fetch; git merge), git mettra à jour les fichiers sans changer de propriétaire (git ne stocke pas ces informations). Mais s'il y a de nouveaux fichiers à créer, l'utilisateur actuel sera défini comme propriétaire.

Il existe différentes solutions pour résoudre ce problème. Le plus simple est probablement d'ajouter un post-updatehook (dans votre .git/hooksrépertoire) pour appeler automatiquement chown john:john . -Raprès fusion / pull ( voir cette solution SO pour un exemple ).

Les solutions alternatives sont:

  • Exécuter en git pulltant qu'utilisateur john au lieu de root (cela nécessitera des autorisations d'écriture sur john pour le répertoire .git).
  • Créez un hook pour effectuer le déploiement, qui utilisera soit john en tant qu'utilisateur, soit effectuera le chown après la mise à jour (vous devrez donc le faire git pullà l'intérieur du post-receivehook du repo nu).
Asenar
la source
Et si vous faites en git fetchtant que root puis en git mergetant qu'utilisateur john? John aura-t-il toujours besoin d'autorisations en écriture pour le .gitrépertoire?
Wildcard
Oui, la plupart du temps. git fetchen tant que root, les nouveaux fichiers dans .git / objects` peuvent avoir root en tant que propriétaire. git mergecomme l'utilisateur john tentera (la plupart du temps) d'écraser au moins .git/indexet .git/HEAD(qui pourrait être supprimé / créé à chaque changement, je suppose), et d'écrire quelques fichiers .git/objects/. + tout nouveau fichier dans votre répertoire de travail. Il y a peut-être des exceptions avec la fusion rapide par exemple.
Asenar