web-dev-qa-db-fra.com

Comment restaurer les permissions des fichiers et des répertoires dans git s'ils ont été modifiés?

J'ai une caisse de git. Toutes les permissions sur les fichiers sont différentes de ce que git pense qu'elles devraient être, elles apparaissent donc toutes modifiées.

Sans toucher au contenu des fichiers (je veux juste modifier les autorisations), comment puis-je définir toutes les autorisations de fichiers sur ce que git pense qu'elles devraient être?

251
Dale Forester

Git suit l'évolution de filepermission et expose les modifications apportées aux autorisations lors de la création de correctifs à l'aide de git diff -p. Donc tout ce dont nous avons besoin est:

  1. créer un patch inversé
  2. inclure uniquement les modifications d'autorisation
  3. appliquer le correctif sur notre copie de travail

En une ligne:

git diff -p -R --no-color \
    | grep -E "^(diff|(old|new) mode)" --color=never  \
    | git apply

vous pouvez aussi l'ajouter comme alias à votre config git ...

git config --global --add alias.permission-reset '!git diff -p -R --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply'

... et vous pouvez l'invoquer via:

git permission-reset

Remarquez que si votre shell est bash, veillez à utiliser ' au lieu de " entre guillemets autour du !git, sinon il sera remplacé par la dernière commande git. vous avez couru.

Merci à @Mixologic pour avoir signalé qu'en utilisant simplement -R sur git diff, la lourde commande sed n'est plus nécessaire.

512
muhqu

Essayez _git config core.fileMode false_

Remarque: _core.fileMode_ est sensible à la casse !

À partir de la page de manuel git config :

_core.fileMode_

Si la valeur est false, les différences entre les bits exécutables entre l'index et la copie de travail sont ignorées. utile sur les systèmes de fichiers cassés comme FAT. Voir git-update-index (1) .

La valeur par défaut est true, sauf que git-clone (1) ou git-init (1) sondera et définira core.fileMode sur false si nécessaire lors de la création du référentiel.

105
Tim Henigan

Git ne stocke pas les autorisations de fichiers autres que les scripts exécutables. Pensez à utiliser quelque chose comme git-cache-meta pour enregistrer la propriété du fichier et les autorisations.

Git ne peut stocker que deux types de modes: 755 (exécutable) et 644 (non exécutable). Si votre fichier contient 444 fichiers, il sera stocké à 644.

9
kroger
git diff -p \
| grep -E '^(diff|old mode|new mode)' \
| sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
| git apply

fonctionnera dans la plupart des cas, mais si vous avez des outils de diff externes comme meld installés, vous devez ajouter --no-ext-diff

git diff --no-ext-diff -p \
    | grep -E '^(diff|old mode|new mode)' \
    | sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
    | git apply

était nécessaire dans ma situation

6
zainengineer

Vous pouvez également essayer un crochet pré/post checkout qui pourrait faire l'affaire.

Voir: Personnalisation de Git - Crochets Git

0
Doug