Appliquer automatiquement "git update-index --chmod=+x" aux fichiers exécutables

j'ajoute souvent des scripts bash à mon dépôt git, et les scripts ont des permissions exécutables dans le système de fichiers linux avant le git add. Mais après avoir poussé les fichiers ajoutés dans un dépôt distant et avoir tiré dans un autre endroit, les fichiers apparaissent avec des permissions non exécutables. Il semble y avoir deux façons de corriger le problème:

1. chmod u+x $script 
   git commit -am "fixing the script permissions... again..."

ou

2. git update-index --chmod=+x $script

au lieu de corriger les permissions à chaque fois, y a-t-il un moyen d'avoir git simplement regarder permissions de fichier sur le script pendant git add, reconnaissez que " hé, ceci est un fichier exécutable!"et l'ajouter au référentiel avec l'exécutable directement les autorisations?

44
demandé sur battey 2013-01-11 01:19:21

5 réponses

Il y a plusieurs façons de le faire.

  1. git alias
  2. Bash alias
  3. ou encore combiner des alias bash et git
  1. git alias

    vous pouvez toujours utiliser bash dans votre alias git.

    • Ouvrir votre git config:

      vim ~/.gitconfig

    • ajouter une section d'alias (si on ne existent):

      [alias]
          addscr = !sh -c 'if [[ ${0: -3} == ".sh" ]]; then git update-index --chmod=+x ; git add '
      
  2. Bash alias

    • éditez votre fichier de profil bash:

      vim ~/.bashrc

    • Ajouter ceci à la fin du fichier:

      function gitadd(){
          if [[ ${1: -3} == ".sh" ]]
              then git update-index --chmod=+x 
          fi
          git add 
       }
       alias gitadd='gitadd'
      
  3. combinez les alias Git et bash

    • éditez votre fichier de profil bash:

      vim ~/.bashrc

    • ajouter ce à la fin du fichier:

      function checkShellFile(){
          return ${1: -3} == ".sh"
      }
      alias gitadd='checkShellFile ? git addsrcipt "" : && git add ""'
      
    • éditez votre fichier de configuration git:

      vim ~/.gitconfig

    • ajouter une section d'alias (si elle n'existe pas):

      [alias]
          addscript = !sh -c 'git update-index --chmod=+x  && git add '
      

aucun des éléments ci-dessus n'a été testé

12
répondu PassTeT 2016-06-02 21:29:12

git 2.9.X / 2.10 (T3 2016) apporte chmodgit add lui-même!

Voir valider 4e55ed3 (31 Mai 2016) par Edward Thomson (ethomson).

Aidé par: Johannes Schindelin (dscho).

(fusionné par Junio C. Hamano -- gitster--valider c8b080a, 06-Juil-2016)

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

le bit exécutable ne sera pas détecté (et ne sera donc pas set) pour les chemins dans un référentiel avec core.filemode mis à false, bien que les utilisateurs peuvent toujours souhaiter ajouter des fichiers comme exécutable pour compatibilité avec d'autres utilisateurs qui core.filemode fonctionnalité.

Par exemple, les utilisateurs de Windows ajoutant des scripts shell peuvent souhaiter les ajouter comme exécutables pour la compatibilité avec les utilisateurs sur Non-Windows.

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

Vous pouvez voir l'origine de cette nouvelle fonctionnalité dans " comment créer des permissions de mode d'exécution de fichier en Git sous Windows?" (Fév. 2011)

25
répondu VonC 2017-05-23 12:18:25

voici un script pour appliquer automatiquement "git update-index --chmod+x" aux fichiers exécutables:

for f in `find . -name '*.sh' -o -regex './s?bin/[^/]+' -o -regex './usr/sbin/[^/]+' -o -regex './usr/lib/[^/]+' `;do
 ( cd `dirname $f` && git update-index --chmod=+x  `basename $f` )
done 
4
répondu l0pan 2014-07-11 19:13:44

Une solution sans fantaisie scripts bash:

  1. Set fileMode = true dans votre .git/config fichier (ou en cours d'exécution git config core.filemode true comme d'autres l'ont souligné)
  2. modifiez le bit exécutable sur les permissions du fichier et propagez cette modification. ( chmod u+x $script comme vous l'avez souligné). Vous n'avez qu'à faire une seule fois.
  3. Poussoir de la télécommande

la prochaine fois que vous sortirez de là, git définira le bit exécutable engagé sur le fichier. J'ai aussi avait des problèmes similaires, ce qui les a résolus.

fileMode = true dit à git de suivre la seule chose à propos des permissions qu'il peut: le bit exécutable. Cela signifie que les modifications apportées au bit exécutable seront reconnues par git comme des modifications dans l'arborescence de travail et que ces modifications seront stockées dans le fichier repo lors de votre prochaine propagation.

une fois que vous avez engagé le bit exécutable désiré, vous pouvez également réinitialiser votre fileModefalse ainsi la prochaine fois git ne vous ennuiera pas avec de tels changements quand vous ne voulez pas à les commettre.

2
répondu A. Sallai 2016-12-03 10:37:30

je ne pense pas que cela peut être fait sur l' git add commande, mais vous pourriez être en mesure d'exécuter un script juste après l'exécution de l' git commit commande, mais avant que le commit soit créé.

jetez un coup d'oeil au crochet de pre-commit.

http://git-scm.com/book/en/Customizing-Git-Git-Hooks

en gros il suffit de créer un fichier dans votre .git/hooks/ dossier appelé pré-validation. (Il devrait y avoir des échantillons déjà dans votre dossier hooks, renommez-les en supprimer le ".l'échantillon" à la fin de l'activer.)

Theres une chasse aux sorcières. Assurez-vous que votre script fonctionne git stash -q d'abord pour que votre travail sur les versions mises en scène réelles de fichiers.

1
répondu eddiemoya 2013-04-01 05:18:56