Si vous arrivez sur cette page maintenant, je viens juste de passer par cela aujourd'hui et je peux résumer où j'en suis. Si vous n'avez pas encore essayé cela, quelques détails ici pourraient aider.
Je pense que l'approche de @Omid Ariyan est la meilleure façon de procéder. Ajoutez les scripts de pré-engagement et de post-extraction. N'OUBLIEZ pas de les nommer exactement comme le fait Omid et N'OUBLIEZ pas de les rendre exécutables. Si vous oubliez l'un des deux, ils n'auront aucun effet et vous exécuterez "git commit" en vous demandant pourquoi rien ne se passe :) De plus, si vous copiez-collez à partir du navigateur web, faites attention à ce que les guillemets et les guillemets simples ne soient pas altérés.
Si vous exécutez le script de pré-engagement une fois (en exécutant un git commit), alors le fichier .permissions sera créé. Vous pouvez l'ajouter au dépôt et je pense qu'il est inutile de l'ajouter encore et encore à la fin du script de pré-engagement. Mais cela ne fait pas de mal, je pense (j'espère).
Il y a quelques petites questions concernant le nom du répertoire et l'existence d'espaces dans les noms de fichiers dans les scripts d'Omid. Les espaces posaient problème ici et j'ai eu des difficultés avec la correction de l'IFS. Pour mémoire, ce script de pré-engagement a fonctionné correctement pour moi :
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
# Effacer le fichier de base de données des permissions
> $DATABASE
echo -n "Sauvegarde des permissions des fichiers..."
IFSold=$IFS
IFS=$'\n'
for FILE in `git ls-files`
do
# Sauvegarder les permissions de tous les fichiers dans l'index
echo $FILE";"`stat -c "%a;%U;%G" $FILE` >> $DATABASE
done
IFS=${IFSold}
# Ajouter le fichier de base de données des permissions à l'index
git add $DATABASE
echo "OK"
Maintenant, qu'est-ce que nous obtenons de tout cela ?
Le fichier .permissions se trouve dans le répertoire principal du dépôt git. Il a une ligne par fichier, voici le début de mon exemple :
$ cat .permissions
.gitignore;660;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.doc;664;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.pdf;664;pauljohn;pauljohn
Comme vous pouvez le voir, nous avons
chemin_d'accès;permissions;propriétaire;groupe
Dans les commentaires sur cette approche, l'un des contributeurs se plaint que cela ne fonctionne qu'avec le même nom d'utilisateur, et c'est techniquement vrai, mais c'est très facile à corriger. Notez que le script post-checkout a 2 parties d'action,
# Définir les permissions du fichier
chmod $PERMISSIONS $FILE
# Définir le propriétaire et le groupe du fichier
chown $USER:$GROUP $FILE
Je garde seulement la première, c'est tout ce dont j'ai besoin. Mon nom d'utilisateur sur le serveur Web est en effet différent, mais plus important encore, vous ne pouvez pas exécuter chown à moins d'être root. Vous pouvez exécuter "chgrp", cependant. Il est assez simple de comprendre comment l'utiliser.
Dans la première réponse de ce post, celle qui est la plus largement acceptée, la suggestion est d'utiliser git-cache-meta, un script qui fait le même travail que les scripts de crochet pre/post ici (analyse de la sortie de git ls-files
). Ces scripts sont plus faciles pour moi à comprendre, le code git-cache-meta est plutôt plus élaboré. Il est possible de conserver git-cache-meta dans le chemin et d'écrire des scripts de pré-engagement et de post-extraction qui l'utiliseraient.
Les espaces dans les noms de fichiers posent problème avec les deux scripts d'Omid. Dans le script de post-extraction, vous saurez que vous avez des espaces dans les noms de fichiers si vous voyez des erreurs comme celle-ci
$ git checkout -- upload.sh
Restauration des permissions des fichiers...chmod: impossible d'accéder à '04.StartingValuesInLISREL/Open' : Aucun fichier ou dossier de ce type
chmod: impossible d'accéder à 'Notebook.onetoc2' : Aucun fichier ou dossier de ce type
chown: impossible d'accéder à '04.StartingValuesInLISREL/Open' : Aucun fichier ou dossier de ce type
chown: impossible d'accéder à 'Notebook.onetoc2' : Aucun fichier ou dossier de ce type
Je cherche des solutions à cela. Voici quelque chose qui semble fonctionner, mais je n'ai testé que dans un cas
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
echo -n "Restauration des permissions des fichiers..."
IFSold=${IFS}
IFS=$
while read -r LINE || [[ -n "$LINE" ]];
do
FILE=`echo $LINE | cut -d ";" -f 1`
PERMISSIONS=`echo $LINE | cut -d ";" -f 2`
USER=`echo $LINE | cut -d ";" -f 3`
GROUP=`echo $LINE | cut -d ";" -f 4`
# Définir les permissions du fichier
chmod $PERMISSIONS $FILE
# Définir le propriétaire et le groupe du fichier
chown $USER:$GROUP $FILE
done < $DATABASE
IFS=${IFSold}
echo "OK"
exit 0
Comme les informations sur les permissions sont une ligne à la fois, j'ai défini IFS sur $, de sorte que seules les sauts de ligne sont considérés comme de nouvelles choses.
J'ai lu qu'il est TRÈS IMPORTANT de rétablir la variable d'environnement IFS comme elle était ! Vous pouvez voir pourquoi une session shell pourrait mal tourner si vous laissez $ comme seul séparateur.
1 votes
Possible duplicate de git - comment récupérer les autorisations de fichier que git pense que le fichier devrait avoir?
1 votes
Ouais, je suppose, bien que la solution à laquelle ils font référence, franchement, je ne suis pas sûr de ce que je dois en faire. J'espérais une approche plus directe.
0 votes
Que dire de la situation où le code source provient de l'environnement de développement (par exemple Windows - XAMPP, etc.) qui n'a pas d'informations sur la propriété des fichiers? Les fichiers à la fin du processus git doivent correspondre à la propriété et aux autorisations de l'emplacement cible. Git-cache-meta peut-il gérer cela? D'accord avec Yarin ... sûrement il s'agit d'un cas d'utilisation assez classique, qui devrait avoir une solution assez simple?