Autorisations de fichier Git sur Windows

173

J'ai lu quelques questions concernant les autorisations de fichiers dans Git et je suis encore un peu confus. J'ai un dépôt sur GitHub dérivé d'un autre. Après la fusion, ils doivent être identiques. Toutefois:

$ git diff --summary origin/epsilon master/epsilon
 mode change 100644 => 100755 ants/dist/sample_bots/csharp/compile.sh
 mode change 100644 => 100755 ants/dist/starter_bots/coffeescript/MyBot.coffee
 mode change 100644 => 100755 ants/dist/starter_bots/coffeescript/ants.coffee
 mode change 100644 => 100755 ants/util/block_test.sh
 mode change 100644 => 100755 manager/mass_skill_update.py
 mode change 100644 => 100755 worker/jailguard.py
 mode change 100644 => 100755 worker/release_stale_jails.py
 mode change 100644 => 100755 worker/start_worker.sh

J'ai essayé de changer les autorisations de fichier, mais cela ne modifie pas les résultats de diff.

Synesso
la source

Réponses:

347

J'ai trouvé la solution pour changer les autorisations (également) sur Windows ici: http://blog.lesc.se/2011/11/how-to-change-file-premissions-in-git.html

Par exemple, la commande suivante ajoute l'autorisation d'exécution de l'utilisateur à un fichier arbitraire:

git update-index --chmod=+x <file>
dedek
la source
6
+1: exactement ce dont j'avais besoin pour m'assurer que les scripts shell que je commets à partir de Windows (où j'ai core.filemodedéfini false) ont réellement le bit d'exécution défini.
tomlogic
Dans mon cas, j'ai également ajouté une nouvelle ligne au fichier, et ce n'est
qu'alors que j'ai
5
Sous Windows, bash-git, je besoin d' un --adddrapeau à l'exécution pour une raison: git update-index --add --chmod=+x <file>. Après cela, le dossier était déjà en scène avec le chmod
Jefferson Quesado
N'a plus d'effet, ni dans git bash ni dans l'invite cmd.exe.
Ben
107

À partir d'une autre question ici sur stackoverflow: Comment faire pour que Git ignore les changements de mode de fichier (chmod)?

Essayer:

git config core.filemode false

Depuis git-config (1) :

   core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.
Corey Henderson
la source
Merci. J'ai vu ça aussi. Je l'ai essayé et cela n'a fait aucune différence.
Synesso
3
J'ai eu des problèmes similaires à l'OP et je ne pouvais pas effectuer de modifications, quelle que soit la façon dont hardj'essayais de réinitialiser. Cela a fait l'affaire pour moi.
Jo-Herman Haugholt
11
[project] /. git / config peut contenir le même paramètre et remplacera ~ / .gitconfig. Si vous essayez de le définir globalement, assurez-vous qu'il n'est pas remplacé localement.
Binary Phile
1
Je trouve que cela est également nécessaire sur NTFS, malheureusement.
Marc 2377
1
Voilà la réponse!
Andrew Surdu le
29

One-liner pratique pour Git Bash:

find . -name '*.sh' | xargs git update-index --chmod=+x

Il marquera tous les .shfichiers comme exécutables. Après cela, il vous suffit de le faire git commit.

Benoit Blanchon
la source
2
Petite correction pour @ benoit-blanchon one-liner ... le .sh doit être cité. trouver . -nom ' .sh' | xargs git update-index --chmod = + x
Steven le facilement amusé
Vous avez raison, j'ai édité la réponse. Merci @SteventheEasilyAmused.
Benoit Blanchon
15

Si vous utilisez Cygwin git (ou Linux git aussi, je suppose), il y a de fortes chances que votre paramètre core.filemode ait été défini au niveau du projet dans $ projdir / .git / config. J'ai trouvé que je devais faire ce qui suit pour que mon git Cygwin et mon git Windows coexistent bien sur un système de fichiers Windows sans que des changements de mode de fichier inexistants apparaissent tout le temps:

  • supprimer le paramètre de ligne core.filemode dans $ projdir / .git / config
  • dans Windows git, exécutez "git config --global core.filemode false"

Cela permet à mon git Cygwin de continuer à voir les changements de mode de fichier, qui sont généralement pertinents, tout en demandant au git Windows d'ignorer les changements de mode de fichier qu'il voit, qui sont généralement des faux positifs.

sauter
la source
6

Vérifiez d'abord les autorisations de fichier à l'aide de la commande ci-dessous.

git ls-files --stage

Puis modifiez les autorisations. Ici, «x» représente les autorisations d'exécution.

git update-index --chmod=+x 'scriptname.ext'

Maintenant, revérifiez les autorisations.

git fichiers ls --stage

==============================================

si vous utilisez un PC Windows, mais que vous déployez sur une machine Linux. Exécutez la commande ci-dessous en premier lieu pour le rendre compatible pour fonctionner sur une machine Linux

dos2unix nom_script.ext nom_script.ext

Sireesh Yarlagadda
la source
N'y a-t-il aucun moyen de faire quelque chose comme git update-index --chmod=1777 'scriptname.ext'?
Barker Alex
Avez-vous navigué jusqu'au chemin, où se trouve le fichier de script? @alex
Sireesh Yarlagadda
5

Je l'ai corrigé en modifiant les autorisations de fichier dans Ubuntu, en validant, en poussant et tout est OK. Il semble que cela ne fonctionnerait tout simplement pas avec msysgit sous Windows / NTFS.

Synesso
la source
Je recommande GitHub pour Windows. Interface merveilleuse et shell vraiment sympa, j'ai même rendu relativement facile la configuration des clés ssh et l'installation de git flow.
Sangoku