Permisos de archivo Git en Windows

173

He leído algunas preguntas sobre los permisos de archivos en Git y todavía estoy un poco confundido. Tengo un repositorio en GitHub bifurcado de otro. Después de la fusión, deben ser idénticos. Sin embargo:

$ 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

Intenté cambiar los permisos de los archivos, pero no altera los resultados de la diferencia.

Synesso
fuente

Respuestas:

347

Encontré la solución de cómo cambiar los permisos (también) en Windows aquí: http://blog.lesc.se/2011/11/how-to-change-file-premissions-in-git.html

Por ejemplo, el siguiente comando agrega el permiso de ejecución del usuario a un archivo arbitrario:

git update-index --chmod=+x <file>
dedek
fuente
66
+1: exactamente lo que necesitaba para asegurarme de que los scripts de shell que confirmo desde Windows (donde he core.filemodeconfigurado false) realmente tienen el bit de ejecución establecido.
tomlogic
En mi caso, también agregué una nueva línea al archivo, y solo entonces pude comprometerme
oshai
55
En Windows, usando git-bash, que necesitaba una --addbandera para la ejecución por alguna razón: git update-index --add --chmod=+x <file>. Después de esto, el archivo ya estaba en el escenario con el chmod
Jefferson Quesado
Ya no tiene ningún efecto, ni en git bash ni en cmd.exe prompt.
Ben
107

De otra pregunta aquí en stackoverflow: ¿Cómo hago que Git ignore los cambios en el modo de archivo (chmod)?

Tratar:

git config core.filemode false

Desde 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
fuente
Gracias. Yo también lo vi. Lo probé y no hizo ninguna diferencia.
Synesso
3
Tuve problemas similares al OP y no pude hacer cambios sin importar cómo hardintenté restablecer. Esto hizo el truco para mí.
Jo-Herman Haugholt
11
[proyecto] /. git / config puede contener la misma configuración y anulará ~ / .gitconfig. Si está intentando configurarlo globalmente, asegúrese de que no se anule localmente.
Binary Phile
1
Creo que esto también es necesario en NTFS, lamentablemente.
Marc.2377
1
¡Esa es la respuesta!
Andrew Surdu
29

Práctico one-liner para Git Bash:

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

Marcará todos los .sharchivos como ejecutables. Después de eso, solo tienes que hacerlo git commit.

Benoit Blanchon
fuente
2
Pequeña corrección para @ benoit-blanchon one-liner ... se debe citar el .sh. encontrar . -nombre ' .sh' | xargs git update-index --chmod = + x
Steven el fácilmente divertido
Tienes razón, edité la respuesta. Gracias @SteventheEasilyAmused.
Benoit Blanchon
15

Si utiliza Cygwin git (o Linux git, supongo), existe una buena posibilidad de que su configuración core.filemode se haya establecido en el nivel del proyecto en $ projdir / .git / config. Descubrí que tenía que hacer lo siguiente para que mi git Cygwin y mi git de Windows coexistieran bien en un sistema de archivos de Windows sin que aparezcan cambios de modo de archivo inexistentes todo el tiempo:

  • elimine la configuración de línea core.filemode en $ projdir / .git / config
  • en Windows git, ejecute "git config --global core.filemode false"

Esto permite que mi git de Cygwin continúe viendo cambios en el modo de archivo, que generalmente son relevantes, mientras le indica al git de Windows que ignore los cambios en el modo de archivo que ve, que generalmente son falsos positivos.

skiphoppy
fuente
6

Primero verifique los permisos del archivo usando el siguiente comando.

git ls-files --stage

Luego cambie los permisos. Aquí "x" representa los permisos de ejecución.

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

Ahora vuelva a verificar los permisos.

git ls-files --stage

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

si está utilizando una PC con Windows, pero está implementando en una máquina Linux. Ejecute el siguiente comando en primer lugar para que sea compatible con la máquina Linux

dos2unix scriptname.ext scriptname.ext

Sireesh Yarlagadda
fuente
¿No hay forma de hacer algo así git update-index --chmod=1777 'scriptname.ext'?
Alex Barker
¿Navegó hasta la ruta, donde existe el archivo de script? @alex
Sireesh Yarlagadda
5

Lo arreglé cambiando los permisos de archivo en Ubuntu, commit, push y todo OK. Parece que simplemente no funcionaría con msysgit en Windows / NTFS.

Synesso
fuente
No puedo recomendar GitHub para Windows. Maravillosa interfaz y un shell realmente agradable, incluso hice la configuración de la clave ssh relativamente fácil y la instalación de git flow.
Sangoku