En conservant les autorisations de fichier avec Git
Je veux le contrôle de version de mon serveur web, comme décrit dans Le contrôle de Version de mon serveur web, par la création d'un repo git de mon /var/www directory
. Mon espoir était que je puis être en mesure de pousser du contenu web à partir de notre serveur de dev pour github, la tirer vers notre serveur de production, et de passer le reste de la journée à la piscine.
Apparemment une déformation dans mon plan est que Git ne respectera pas les autorisations de fichier (je n'ai pas essayé, seulement la lecture de ce sujet maintenant.) Je suppose que cela a un sens dans les différentes cases, sont susceptibles d'avoir différentes utilisateur/groupe de configurations. Mais si je voulais la force des autorisations pour se propager, en sachant que mes serveurs sont configurés de la même, dois-je toutes les options? Ou est-il un moyen plus facile d'approche de ce que je suis en train de faire?
- double possible de git - comment faire pour récupérer les autorisations de fichier git pense que le fichier doit être?
- Ouais imagine que oui, mais la solution qu'ils ont point je suis franchement pas sûre de savoir quoi faire avec. A été en espérant pour une approche plus directe.
- Que dire de la situation où le code source est à venir à partir de l'environnement de Dev (par exemple, Windows - XAMPP, etc) qui n'ont pas la propriété de fichier info? Les fichiers à la fin de l'git processus a besoin pour correspondre à la propriété & les autorisations pour l'emplacement cible. Peut git-cache-meta face à cette situation? D'accord avec Yarin ... c'est sûrement une assez mainstream cas d'utilisation, qui devrait avoir un assez simple solution?
Vous devez vous connecter pour publier un commentaire.
La
git-cache-meta
mentionné dans la question "git - comment faire pour récupérer les autorisations de fichier git pense que le fichier doit être?" (et le git FAQ) est le plus staightforward approche.L'idée est de stocker dans un
.git_cache_meta
fichier les autorisations des fichiers et des répertoires.C'est un fichier séparé pas de version directement dans le repo Git.
C'est pourquoi l'utilisation c'est:
Si vous:
git ls-files
.Git est un Système de Contrôle de Version, créée pour le développement de logiciel, donc à partir de l'ensemble des modes et des autorisations qu'il stocke uniquement les exécutables bits (pour les fichiers) et symlink peu. Si vous souhaitez stocker de l'ensemble des autorisations, vous besoin outil tiers, comme
git-cache-meta
(mentionné par VonC), ou Metastore (utilisé par etckeeper). Ou vous pouvez utiliser IsiSetup, qui IIRC utilise git comme backend.Voir Interfaces, interfaces, et des outils page sur Git Wiki.
/usr/share/git-core/contrib/hooks/setgitperms.perl
dans mongit-contrib
paquet-- un script pour un but similaire. ("Ce script peut être utilisé pour sauvegarder/restaurer la pleine propriété et les autorisations données au sein d'un git arbre de travail.")C'est assez tard, mais peut aider certains à d'autres. Je fais ce que vous voulez faire par l'ajout de deux git crochets à mon référentiel.
.git/hooks/pre-commit:
.git/hooks/post-paiement:
Le premier crochet est appelée lorsque vous "engager" et lire la propriété et les autorisations pour tous les fichiers dans le référentiel et de les stocker dans un fichier à la racine du référentiel appelé .autorisations, puis ajouter le .les autorisations de fichier pour la commettre.
La deuxième hook est appelé lorsque vous "checkout" et parcourez la liste des fichiers dans le .les autorisations de fichiers et de restaurer la propriété et les autorisations de ces fichiers.
$SELF_DIR/../../
n'est pas nécessairement la racine du référentiel... maisgit rev-parse --show-toplevel
est. (Je ne sais pas pourquoi vous ne vous contentez pas d'utiliserpwd
pour le répertoire courant, mais c'est discutable de toute façon.)IFS=$'\n'
avant lafor
boucle d'arrêter (etunset IFS
par la suite pour être sûr).chmod 0600 .pgpass
danspost-checkout
. Oui, je vais devoir le mettre à jour manuellement chaque fois que j'ai un fichier qui a besoin d'autorisations spécifiques, mais les pauses.git ls-files -z
et utiliser \0.Dans le cas où vous êtes en ce moment, j'ai juste été à travers elle, aujourd'hui, et peut se résumer où cela se trouve. Si vous n'avez pas essayé encore, certains détails ici pourrait aider.
Je pense que @Omid Ariyan de l'approche est la meilleure façon. Ajouter le pre-commit et post-extraction des scripts. N'oubliez PAS de nom exactement comme Omid ne et NE PAS oublier de le rendre exécutable. Si vous oubliez l'un de ces, ils n'ont aucun effet et que vous l'exécutez "git commit" plus et plus vous demandez-vous pourquoi il ne se passe rien 🙂 Aussi, si vous coupez et collez en dehors du navigateur web, veillez à ce que les guillemets et les tiques ne sont pas modifiées.
Si vous exécutez la pré-script de validation une fois (par l'exécution d'un git commit), puis le fichier .les autorisations seront créés. Vous pouvez l'ajouter au dépôt et je pense qu'il est inutile d'ajouter encore et encore à la fin de la pré-script de validation. Mais il ne fait pas de mal, je pense (je l'espère).
Il y a quelques petits problèmes sur le nom du répertoire et l'existence d'espaces dans les noms de fichier dans Omid scripts. Les espaces étaient un problème ici et j'ai eu quelques difficultés avec les FI correctif. Pour mémoire, cette pré-script de validation ne fonctionne correctement pour moi:
Maintenant, que faisons-nous sortir de cette situation?
L' .les autorisations de fichier est dans le haut niveau du repo git. Il a une ligne par fichier, voici le haut de mon exemple:
Comme vous pouvez le voir, nous avons
Dans les commentaires au sujet de cette approche, l'une des affiches se plaint qu'il ne fonctionne qu'avec le même nom d'utilisateur, et c'est techniquement vrai, mais il est très facile d'y remédier. Note de la poste-caisse script a 2 pièces,
Je suis donc en ne gardant que la première, c'est tout ce dont j'ai besoin. Mon nom d'utilisateur sur le serveur Web est en effet différente, mais plus important encore, vous ne pouvez pas exécuter chown, sauf si vous êtes root. Pouvez exécuter "chgrp", cependant. Il est assez évidente comment mettre à utiliser.
Dans la première réponse dans ce post, celle qui est la plus largement acceptée, la suggestion est donc l'utilisation de git-cache-méta, un script qui est en train de faire le même travail que les pré/post-scripts de hook ici sont en train de faire (l'analyse de la sortie de
git ls-files
). Ces scripts sont plus facile pour moi de comprendre, git-cache-meta code est un peu plus complexe. Il est possible de garder git-cache-meta dans le chemin d'accès et d'écriture pre-commit et post-extraction des scripts qui l'utilisent.Espaces dans les noms de fichiers sont un problème à la fois avec de Omid scripts. Dans l'après-caisse de script, vous saurez que vous avez les espaces dans les noms de fichiers si vous voyez des erreurs, comme cette
Je vérifie sur des solutions pour que. Voici quelque chose qui semble fonctionner, mais je ne l'ai testé dans un cas
Depuis les autorisations de l'information est une ligne à la fois, j'ai mis FI $, de sorte que seuls les sauts de ligne sont considérés comme de nouvelles choses.
J'ai lu qu'il est TRÈS IMPORTANT de définir la variable d'environnement IFS de retour la façon dont il a été! Vous pouvez voir pourquoi une session shell pourrait aller mal si vous laissez $ comme le seul séparateur.
En pre-commit/post-extraction d'une option serait d'utiliser "mtree (FreeBSD), ou "fmtree" (Ubuntu) utilitaire qui "compare une hiérarchie de fichiers contre un cahier des charges, crée un cahier des charges pour une hiérarchie de fichiers, ou modifie un cahier des charges."
Le jeu par défaut sont des drapeaux, gid, lien, mode, nlink, la taille, l'heure, le type, et le uide. Cela peut être équipé de l'objectif spécifique avec commutateur-k.
Je suis en cours d'exécution sur FreeBSD 11.1, freebsd prison de virtualisation rend le système d'exploitation optimale. La version actuelle de Git que j'utilise est 2.15.1, je préfère tout faire sur les scripts shell. Avec cela à l'esprit, j'ai modifié les suggestions ci-dessus comme suit:
git push: .git/hooks/pre-commit
git pull: .git/hooks/post-fusion
Si pour une raison quelconque vous avez besoin de recréer le script le .les autorisations de sortie de fichier doit avoir le format suivant:
Pour une .gitignore fichier avec les permissions 644 donné à root:wheel
Avis, j'ai dû faire quelques modifications pour la stat options.
Profiter,
Un plus @Omid Ariyan la réponse est des autorisations sur les répertoires. Ajouter cette après la
for
de la boucledone
dans sonpre-commit
script.Cela permettra d'économiser des autorisations de répertoire ainsi.
Nous pouvons nous améliorer sur les autres réponses en changeant le format de la
.permissions
fichier exécutablechmod
états, et de faire usage de la-printf
paramètrefind
. Ici, c'est le plus simple.git/hooks/pre-commit
fichier:...et ici, c'est la simplification de la
.git/hooks/post-checkout
fichier:Rappelez-vous que d'autres outils pourraient avoir déjà configuré ces scripts, de sorte que vous pouvez avoir besoin de les fusionner ensemble. Pour exemple, voici un
post-checkout
script qui comprend également legit-lfs
commandes: