Mettre à jour et valider uniquement les autorisations d'un fichier à l'aide du contrôle de version git

187

Je viens de transformer un some.shfichier en exécutable ( chmod 755 ...), les permissions ont été mises à jour mais pas le contenu. Existe-t-il un moyen de valider le fichier dans git, de sorte que le bit exécutable soit restauré / défini sur clone / checkout / pull ?

Mise à jour: comment puis-je savoir que les nouvelles autorisations ont été soumises github?

BreakPhreak
la source

Réponses:

190

Par défaut, git mettra à jour les autorisations d'exécution des fichiers si vous les modifiez. Il ne changera ni ne suivra aucune autre autorisation.

Si vous ne voyez aucun changement lors de la modification de l'autorisation d'exécution, vous avez probablement une configuration dans git qui ignore le mode fichier.

Regardez dans votre projet, dans le .gitdossier du configfichier et vous devriez voir quelque chose comme ceci:

[core]
    filemode = false

Vous pouvez le changer truedans votre éditeur de texte préféré ou exécuter:

git config core.filemode true

Ensuite, vous devriez pouvoir valider normalement vos fichiers. Il ne validera que les modifications d'autorisation.

Vincent B.
la source
Merci! comment puis-je savoir que les modifications d'autorisation ont été soumises github?
BreakPhreak
2
Vous pouvez le voir lorsque vous affichez un fichier (par exemple, sur le fichier Rails gitignore , vous trouverez 100644 comme autorisation de fichier)
Vincent B.
8
Faire des changements d'autorisations sur Windows avec git (en fait changer les permissions du fichier et commettre): blog.lesc.se/2011/11/how-to-change-file-premissions-in-git.html
fooMonster
39
Cette réponse est fausse! Git ne suit que si un fichier est exécutable ou non. Il ne suit pas les autres autorisations de fichiers telles que les fichiers inscriptibles ou lisibles. Lisez stackoverflow.com/a/11231682/2311074 pour en savoir plus.
Adam le
Pour moi, webstorm n'a pas attrapé le changement, mais dans git status, je vois des changements ..
Townsheriff
193

L'article @fooMonster a fonctionné pour moi

# git ls-tree HEAD
100644 blob 55c0287d4ef21f15b97eb1f107451b88b479bffe    script.sh

Comme vous pouvez le voir, le fichier a la permission 644 (ignorant les 100). Nous aimerions le changer en 755:

# git update-index --chmod=+x script.sh

valider les changements

# git commit -m "Changing file permissions"
[master 77b171e] Changing file permissions
0 files changed, 0 insertions(+), 0 deletions(-)
mode change 100644 => 100755 script.sh
ewwink
la source
7
Il convient de noter que vous devez en fait utiliser '-x / + x'. Vous ne pouvez pas définir d'autres autorisations ou un masque de bits.
Devolus
note que l'utilisation git commit -an'a rien fait pour moi, mais la configuration du message sur la ligne de commande l'a fait. Bit of a
quirk
L'ordre de commande doit être: # git update-index --chmod=+x script.sh # git ls-tree HEAD # git commit -m "Changing file permissions" # git push
SimonDepelchin
30

Ne travaille pas pour moi.

Le mode est vrai, les perms de fichiers ont été modifiées, mais git dit qu'il n'y a pas de travail à faire.

git init
git add dir/file
chmod 440 dir/file
git commit -a

Le problème semble être que git ne reconnaît que certaines modifications d'autorisation.

Otheus
la source
51
Correct - gitne détecte vraiment que si un fichier est exécutable ou non, pas l'ensemble complet des autorisations * nix. Il faudrait donc basculer un fichier entre exécutable / non pour qu'il pense que vous avez changé quelque chose qui vaut la peine d'être engagé ...
twalberg
Je n'ai pas trouvé de documentation claire: quel déclencheur post-action puis-je utiliser pour définir les permanentes en conséquence?
Otheus
2
Eh bien, il existe un post-checkouthook in git, qui couvrirait certains cas, mais je ne suis pas sûr que cela couvre toutes les choses possibles qui mettent à jour les fichiers dans votre arbre de travail. Vous feriez peut-être mieux d'avoir un script shell supplémentaire dans votre référentiel qui définit les choses en conséquence. Alternativement, il existe quelques projets qui augmentent gitpour stocker les métadonnées, mais je n'ai jamais vraiment essayé aucun d'entre eux ...
twalberg
1
J'ai changé les autorisations de fichier en 777 et je l'ai fait git update-index --refresh, mais le diff montre old mode 100644 new mode 100755. Il n'a pas mis à jour toutes les autorisations
hudac
voir la réponse @tishma ici stackoverflow.com/questions/14557106/… . C'est ce qui a fonctionné pour moi
gary69