Comment créer des autorisations de mode d'exécution de fichier dans Git sous Windows?

378

J'utilise Git dans Windows et je veux pousser le script shell exécutable dans git repo par un commit.

Habituellement, je dois faire deux étapes ( git commit).

$ vi install.sh
$ git add install.sh  
$ git commit -am "add new file for installation" # first commit
[master f2e92da] add support for install.sh
 1 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 install.sh
$ git update-index --chmod=+x install.sh
$ git commit -am "update file permission"        # second commit
[master 317ba0c] update file permission
  0 files changed
  mode change 100644 => 100755 install.sh

Comment puis-je combiner ces deux étapes en une seule étape? configuration git? commande windows?

Rappel : deux réponses sont bonnes, git add --chmod=+x fileest prise en charge dans la nouvelle version git

Référence: voir la question dans les autorisations de fichier Git sur Windows pour le deuxième commit

Larry Cai
la source
10
Avec git 2.9.x / 2.10 (Q3 2016), git add --chmod=+xc'est effectivement possible. Voir ma réponse ci - dessous , crédit à Edward Thomson .
VonC
5
Il vaudrait la peine de mettre à jour la réponse sélectionnée à la git add --chmod=+xversion
mikemaccana

Réponses:

593

Il n'est pas nécessaire de le faire en deux validations, vous pouvez ajouter le fichier et le marquer comme exécutable en une seule validation:

C:\Temp\TestRepo>touch foo.sh

C:\Temp\TestRepo>git add foo.sh

C:\Temp\TestRepo>git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

Comme vous le constatez, après l'ajout, le mode est 0644 (c'est-à-dire non exécutable). Cependant, nous pouvons le marquer comme exécutable avant de valider:

C:\Temp\TestRepo>git update-index --chmod=+x foo.sh

C:\Temp\TestRepo>git ls-files --stage
100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

Et maintenant, le fichier est en mode 0755 (exécutable).

C:\Temp\TestRepo>git commit -m"Executable!"
[master (root-commit) 1f7a57a] Executable!
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100755 foo.sh

Et maintenant, nous avons un seul commit avec un seul fichier exécutable.

Edward Thomson
la source
148

En effet, ce serait bien d' git-addavoir un --modedrapeau

git 2.9.x / 2.10 (T3 2016) permettra en fait (grâce à Edward Thomson ):

git add --chmod=+x -- afile
git commit -m"Executable!"

Cela rend le processus plus rapide et fonctionne même s'il core.filemodeest défini sur false.

Voir commit 4e55ed3 (31 mai 2016) par Edward Thomson ( ethomson) .
Aidé par: Johannes Schindelin ( dscho) .
(Fusionné par Junio ​​C Hamano - gitster- en commit c8b080a , 06 juil.2016 )

add: ajouter --chmod=+x/ --chmod=-xoptions

Le bit exécutable ne sera pas détecté (et ne sera donc pas ensemble) pour les chemins dans un référentiel avec la core.filemodevaleur false, bien que les utilisateurs voudront peut -être encore ajouter des fichiers exécutables comme pour la compatibilité avec d' autres utilisateurs qui faire ont la core.filemode fonctionnalité.
Par exemple, les utilisateurs de Windows qui ajoutent des scripts shell peuvent souhaiter les ajouter en tant qu'exécutables pour la compatibilité avec les utilisateurs non-Windows.

Bien que cela puisse être fait avec une commande de plomberie ( git update-index --add --chmod=+x foo), l' enseignement de la git-addcommande permet aux utilisateurs de définir un fichier exécutable avec une commande qu'ils connaissent déjà .

VonC
la source
22

Si les fichiers ont déjà l'indicateur + x défini, git update-index --chmod=+xne fait rien et git pense qu'il n'y a rien à valider, même si l'indicateur n'est pas enregistré dans le dépôt.

Vous devez d'abord supprimer l'indicateur, exécuter la commande git, puis remettre l'indicateur:

chmod -x <file>
git update-index --chmod=+x <file>
chmod +x <file>

alors git voit un changement et vous permettra de valider le changement.

Bohème
la source
10

La note est tout d'abord que vous devez vous assurer d'avoir filemodedéfini falsedans le fichier config git, ou utilisez cette commande:

git config core.filemode false

puis vous pouvez définir l'autorisation 0777 avec cette commande:

git update-index --chmod=+x foo.sh
Nabi KAZ
la source
3

Je n'ai pas de commande touchet chmoddans mon cmd.exe et git update-index --chmod=+x foo.shne fonctionne pas pour moi.

Je le résous finalement en mettant skip-worktreebit:

git update-index --skip-worktree --chmod=+x foo.sh
khiav reoy
la source