Sous Ubuntu et Debian, les derniers fichiers validés obtiennent le bit d'exécution défini, lorsque j'essaie une vérification par la suite. C'est assez étrange et ça me rend dingue:
$ ls -l file
-rw-r--r-- ... file
# on branch master:
$ git commit -m 'mode is 644' file
[master 0123456] mode is 644
1 files changed, 1 insertions(+), 1 deletions(-)
# All ok
$ git checkout dev-branch
Switched to branch 'dev-branch'
# Seemingly all ok, but file now has the exec bit set
$ git merge master
Updating 6543210..0123456
error: Your local changes to 'file' would be overwritten by merge. Aborting.
Please, commit your changes or stash them before you can merge.
# Oops...
$ ls -l file
-rwxr-xr-x ... file
Quelqu'un at-il une idée, quand et pourquoi le bit d'exécution se glisse? core.filemode
est défini sur true
.
J'ai le fichier ouvert dans vim pendant le changement de branche, si c'est important d'une manière ou d'une autre.
Addendum 1: C'est la caisse, où les autorisations sont vissées. Je peux jouer au jeu indéfiniment:
$ git br
* master
dev-branch
$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755
$ chmod 644 file
$ git diff
$ git checkout dev-branch
$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755
$ chmod 644 file
$ git diff
$ git checkout master
$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755
# ...and so on ad inf.
Addendum 2: Cela se produit, en passant, pour chaque fichier dans ce référentiel, que je valide. Après la validation réussie, je ne peux pas changer de branche sans la permission.
git-log
ne montre aucune sortie du tout, pour aucune combinaison demaster
,dev-branch
ouHEAD
(ce qui est étrange, n'est-ce pas? La commande ne devrait-elle pas imprimer le dernier message de validation demaster
?)Réponses:
Pas un utilisateur Git, mais je pense que Git stocke l'intégralité du masque d'autorisation de fichier.
Cela signifie que vous avez défini le fichier sur exécutable, que Git a récupéré et répliqué dans le référentiel. Par conséquent, vous devez modifier le masque d'autorisation du fichier lui-même avant de valider.
Pour que Git ignore ces modifications, utilisez
Depuis git-config (1) :
la source
core.fileMode
, mais j'espérais pouvoir le quittertrue
.Avez-vous vérifié s'il existe un hook personnalisé qui est exécuté lors de la validation ou de l'extraction? Il peut y avoir des crochets personnalisés altérant vos fichiers. Extrayez le githooks manpage .
Les hooks sont fondamentalement de petits programmes appelés par git lors de certains événements (commit, checkout etc.).
la source
.git/hooks
répertoire est intact.avez-vous essayé git commit -m 'mode is 644' file on branch dev-branch
pour moi, il semble que ce qui se passe, c'est que vous modifiez les autorisations sur le principal, puis que vous tiriez vers le bas la branche de développement qui a la mauvaise autorisation, encombrant votre autorisation locale. puis essayez de vous engager à nouveau. soit cloner, modifier, valider, fusionner; ou essayez de changer le fichier individuellement avec une seule validation de fichier dans dev puis fusionnez
la source
chmod
fois une ing sur les fichiers, mais je ne me souviens malheureusement pas si le problème a commencé à se produire juste après. Je pense que non.Il y a de bonnes réponses à ces liens.
/programming/9027584/how-to-change-the-file-mode-on-github
et
/programming/1611211/how-do-i-make-git-accept-mode-changes-without-accepting-all-text-changes
Essentiellement, vous devez le faire
git update-index --chmod=(+|-)x <file>
et cela ajoutera une modification que vous devrez ensuite valider et pousser pour que les autorisations soient ajoutées / supprimées.la source