249 votes

Comment ajouter des autorisations chmod pour déposer dans GIT?

Je veux git commettre un fichier .sh, mais je veux qu'il soit exécutable lorsque je récupère ce même fichier sur un autre serveur.

Y at-il un moyen de le faire sans chmod manuellement ce fichier dans les serveurs qui extraient le fichier?

408voto

Antwane Points 7923

Selon la documentation officielle, vous pouvez définir ou supprimer le "exécutable" drapeau sur n'importe quel fichier suivi à l'aide de update-index sous-commande.

Utilisation

git update-index --chmod=+x path/to/file

pour définir le drapeau et

git update-index --chmod=-x path/to/file

pour l'enlever.

Sous le capot

Bien que cela ressemble à la régulière des fichiers unix système d'autorisation, en fait il ne l'est pas. Git maintient un spécial "mode" pour chaque fichier dans la mémoire de stockage interne:

  • 100644 pour les fichiers standard
  • 100755 pour ceux exécutable

Vous pouvez le visualiser à l'aide de ls-file sous-commande, avec --stage option:

$ git ls-files --stage
100644 aee89ef43dc3b0ec6a7c6228f742377692b50484 0       .gitignore
100755 0ac339497485f7cc80d988561807906b2fd56172 0       my_executable_script.sh

Par défaut, lorsque vous ajoutez un fichier à un référentiel, Git va essayer d'honorer son système de fichier d'attributs et de définir la bonne filemode en conséquence. Vous pouvez désactiver cette fonction en définissant core.fileMode option à false:

git config core.fileMode false

Dépannage

Si, à un certain point le Git filemode n'est pas fixé, mais le fichier est correct du système de fichiers drapeau, essayez de supprimer le mode, puis de nouveau:

git update-index --chmod=-x path/to/file
git update-index --chmod=+x path/to/file

Bonus

Départ avec Git 2.9, vous pouvez transférer un fichier ET mettre le drapeau en une seule commande:

git add --chmod=+x path/to/file

37voto

torek Points 25463

Antwane la réponse est correcte, et cela devrait être à un commentaire, mais les commentaires n'ont pas assez d'espace et ne permettent pas la mise en forme. :-) Je veux juste ajouter que dans Git, les autorisations de fichier sont enregistrées seulement1 comme 644 ou 755 (orthographié (100644 et 100755; 100 "correspond à "un fichier régulier"):

diff --git a/path b/path
new file mode 100644

L'ex-644-signifie que le fichier doit pas être exécutable, et le second signifie qu'il doit être exécutable. Comment cela se transforme en un véritable fichier de modes à l'intérieur de votre système de fichiers est un peu dépendants. Sur les systèmes Unix, les bits sont transmis par le biais de votre umask , ce qui devrait normalement être 022 de retirer l'autorisation d'écriture de "groupe" et "les autres", ou 002 pour retirer la permission d'écrire que "d'autres". Il pourrait également être 077 si vous êtes particulièrement préoccupé par la confidentialité et souhaitez supprimer, lire, écrire, et exécuter la permission de les deux "groupe" et "autres".


1les premières versions de Git enregistré des autorisations de groupe, de sorte que certains dépôts ont entrées dans l'arborescence avec mode d' 664 . Moderne Git n'est pas, mais depuis aucune partie de n'importe quel objet peut jamais être modifié, ces vieux autorisations bits, persistent dans de vieux objets de l'arborescence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X