Je veux git commit un fichier .sh, mais je veux qu'il soit exécutable lorsque je récupère ce même fichier sur un autre serveur.
Existe-t-il un moyen de le faire sans chmod u + x manuellement ce fichier dans les serveurs qui extraient le fichier?
Selon la documentation officielle , vous pouvez définir ou supprimer le drapeau "exécutable" sur n'importe quel fichier suivi en utilisant la update-index
sous-commande.
Pour définir l'indicateur, utilisez la commande suivante:
git update-index --chmod=+x path/to/file
Pour le supprimer, utilisez:
git update-index --chmod=-x path/to/file
Sous la capuche
Bien que cela ressemble au système normal d'autorisation des fichiers Unix, ce n'est pas le cas. Git maintient un "mode" spécial pour chaque fichier dans sa mémoire interne:
100644
pour les fichiers normaux100755
pour les exécutablesVous pouvez le visualiser à l'aide de la ls-file
sous-commande, avec l' --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 essaiera d'honorer ses attributs de système de fichiers et de définir le mode de fichier correct en conséquence. Vous pouvez désactiver cela en définissant l' core.fileMode
option sur false:
git config core.fileMode false
Dépannage
Si à un moment donné le mode de fichier Git n'est pas défini mais que le fichier a le bon indicateur de système de fichiers, essayez de supprimer le mode et de le redéfinir:
git update-index --chmod=-x path/to/file
git update-index --chmod=+x path/to/file
Prime
À partir de Git 2.9, vous pouvez organiser un fichier ET définir le drapeau en une seule commande:
git add --chmod=+x path/to/file
La réponse d'Antwane est correcte, et cela devrait être un commentaire, mais les commentaires n'ont pas assez d'espace et ne permettent pas le formatage. :-) Je veux juste ajouter que dans Git, les permissions de fichiers sont enregistrées seulement 1 comme soit
644
ou755
(orthographié (100644
et100755
; la100
partie signifie "fichier normal"):Le premier - 644 - signifie que le fichier ne doit pas être exécutable, et le second signifie qu'il doit être exécutable. La façon dont cela se transforme en modes de fichiers réels dans votre système de fichiers dépend quelque peu du système d'exploitation. Sur les systèmes de type Unix, les bits passent par votre
umask
paramètre, ce qui serait normalement022
de supprimer l'autorisation d'écriture de «groupe» et «autre», ou002
de supprimer l'autorisation d'écriture uniquement de «autre». Cela peut également être le077
cas si vous êtes particulièrement préoccupé par la confidentialité et souhaitez supprimer les autorisations de lecture, d'écriture et d'exécution à la fois du "groupe" et de "l'autre".1 Les versions extrêmement anciennes des autorisations de groupe enregistrées par Git, de sorte que certains référentiels contiennent des entrées d'arborescence avec mode
664
. Ce n'est pas le cas de Git moderne, mais comme aucune partie d'un objet ne peut jamais être modifiée, ces anciens bits d'autorisations persistent dans les anciens objets d'arbre.Le changement pour stocker uniquement 0644 ou 0755 était dans le commit e44794706eeb57f2 , qui est antérieur à Git v0.99 et daté du 16 avril 2005.
la source
e44794706eeb57f2ee38ed1604821aa38b8ad9d2
, c'est-à-dire antérieures à la version 0.99 de Git.