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?
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:
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.
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.
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.
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
Vous pouvez également essayer un crochet pré/post checkout qui pourrait faire l'affaire.