web-dev-qa-db-fra.com

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

J'ajoute fréquemment des scripts bash à mon référentiel git, et les scripts ont des autorisations exécutables dans le système de fichiers linux avant le git add. Mais après avoir poussé les fichiers ajoutés vers un référentiel distant et avoir récupéré un autre emplacement, les fichiers s'affichent avec des autorisations 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 pour que git regarde simplement les permissions du fichier sur le script pendant git add, reconnaissez que "hé, voici un fichier exécutable!" et l'ajouter directement au référentiel avec les autorisations disponibles?

52
Byron Hawkins

Il y a plusieurs façons de procéder.

  1. Alias ​​Git
  2. Alias ​​bash
  3. Ou même combiner des alias bash et git
  1. alias Git

    Vous pouvez toujours utiliser bash dans votre alias git.

    • Ouvrez votre configuration git:

      vim ~/.gitconfig

    • Ajoutez-y une section d'alias (s'il n'en existe pas):

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

    • Modifiez votre fichier de profil bash:

      vim ~/.bashrc

    • Ajoutez ceci à la fin du fichier:

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

    • Modifiez votre fichier de profil bash:

      vim ~/.bashrc

    • Ajoutez ceci à la fin du fichier:

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

      vim ~/.gitconfig

    • Ajoutez-y une section d'alias (s'il n'en existe pas):

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

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

14
PassTeT

git 2.9.X/2.10 (Q3 2016) apporte chmod à git add lui-même!

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

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

Le bit exécutable ne sera pas détecté (et ne sera donc pas défini) pour les chemins dans un référentiel avec core.filemode défini sur false, bien que les utilisateurs puissent toujours souhaiter ajouter des fichiers en tant qu'exécutables pour des raisons de compatibilité avec d'autres utilisateurs qui font ont core.filemode fonctionnalité.
Par exemple, les utilisateurs Windows qui ajoutent des scripts Shell peuvent souhaiter les ajouter en tant qu'exécutables pour assurer 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), enseigner le git-add 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 autorisations de mode d'exécution de fichier dans Git sous Windows? " (février 2011)

26
VonC

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 
7
l0pan

ne solution sans script bash sophistiqué:

  1. Ensemble fileMode = true dans votre .git/config fichier (ou en exécutant git config core.filemode true comme d'autres l'ont souligné)
  2. Modifiez le bit exécutable sur les autorisations du fichier et validez cette modification. (chmod u+x $script comme vous l'avez souligné). Vous ne devez le faire qu'une seule fois.
  3. Poussez vers la télécommande

La prochaine fois que vous tirerez de là, git mettra le bit exécutable validé sur le fichier. J'ai également eu des problèmes similaires, cela les a résolus.

fileMode = true dit à git de suivre la seule chose qu'il peut sur les permissions: 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 ces modifications seront stockées dans le dépôt avec votre prochain commit.

Une fois que vous avez validé le bit exécutable souhaité, vous pouvez également réinitialiser votre fileMode à false pour que la prochaine fois git ne vous dérange pas avec de telles modifications lorsque vous ne voulez pas les valider.

3
A. Sallai

Je ne pense pas que cela puisse être fait sur le git add, mais vous pourrez peut-être exécuter un script juste après avoir exécuté le git commit, mais avant que la validation ne soit réellement créée.

Jetez un œil au crochet de pré-validation.

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

Fondamentalement, créez simplement un fichier dans votre dossier .git/hooks/appelé pré-commit. (Il devrait y avoir des échantillons déjà dans votre dossier hooks, renommez-les pour supprimer le ".sample" à la fin pour en activer un.)

Theres un gotcha. Assurez-vous que votre script s'exécute git stash -q d'abord pour que vous travailliez sur les versions intermédiaires réelles des fichiers.

1
eddiemoya