¿Cómo agregar permisos chmod al archivo en GIT?

182

Quiero que git confirme un archivo .sh, pero quiero que sea ejecutable cuando revise ese mismo archivo en otro servidor.

¿Hay alguna manera de hacerlo sin chmod u + x manualmente ese archivo en los servidores que verifican el archivo?

Henley Chiu
fuente

Respuestas:

291

De acuerdo con la documentación oficial , puede establecer o eliminar el indicador "ejecutable" en cualquier archivo rastreado utilizando el update-indexsubcomando.

Para establecer la bandera, use el siguiente comando:

git update-index --chmod=+x path/to/file

Para eliminarlo, use:

git update-index --chmod=-x path/to/file

Bajo el capó

Si bien esto parece el sistema de permisos de archivos Unix normal, en realidad no lo es. Git mantiene un "modo" especial para cada archivo en su almacenamiento interno:

  • 100644 para archivos regulares
  • 100755 para ejecutables

Puede visualizarlo usando el ls-filesubcomando, con la --stageopción:

$ git ls-files --stage
100644 aee89ef43dc3b0ec6a7c6228f742377692b50484 0       .gitignore
100755 0ac339497485f7cc80d988561807906b2fd56172 0       my_executable_script.sh

De forma predeterminada, cuando agrega un archivo a un repositorio, Git intentará respetar sus atributos del sistema de archivos y establecerá el modo de archivo correcto en consecuencia. Puede deshabilitar esto configurando la core.fileModeopción en falso:

git config core.fileMode false

Solución de problemas

Si en algún momento el modo de archivo Git no está configurado pero el archivo tiene el indicador de sistema de archivos correcto, intente eliminar el modo y configúrelo nuevamente:

git update-index --chmod=-x path/to/file
git update-index --chmod=+x path/to/file

Prima

Comenzando con Git 2.9, puede organizar un archivo Y establecer la bandera en un comando:

git add --chmod=+x path/to/file
Antwane
fuente
Cuando hago eso para probar.sh, git commit y push, y pagar en otro servidor, estos son los permisos de ese archivo: -rw-rw-r-- 1 usuario usuario 12 dic 5 11:42 test.sh
Henley Chiu
Acabo de realizar la prueba en uno de mi repositorio y funciona como se esperaba. Los permisos se establecieron en el archivo utilizando el comando proporcionado en Windows. En uno de mi servidor (Debian) el archivo tenía los permisos -rw-r - r-- antes, ahora configurado en -rwxr-xr-x. ¿Qué versión de git usas en máquinas locales y remotas?
Antwane
git versión 1.9.5 en mi local, y git 1.7.1 en el servidor que realiza el pago.
Henley Chiu
Acabo de intentar clonar en otro servidor (más antiguo) con git 1.7.10, todavía funciona bien, el archivo tiene permisos x. Tal vez cometió un error en algún momento o tiene problemas de permisos con el usuario que clonó en el servidor remoto
Antwane
Tenga en cuenta que solo puede cambiar (establecer o borrar) el permiso de ejecución. Git no rastrea ningún otro permiso (como permiso de lectura o escritura).
Dan Anderson
25

La respuesta de Antwane es correcta, y esto debería ser un comentario, pero los comentarios no tienen suficiente espacio y no permiten el formateo. :-) Solo quiero agregar que en Git, los permisos de archivo se registran solo 1 como 644o 755(deletreado ( 100644y 100755; la 100parte significa "archivo normal"):

diff --git a/path b/path
new file mode 100644

El primero, 644, significa que el archivo no debe ser ejecutable, y el segundo significa que debe ser ejecutable. La forma en que se convierte en modos de archivo reales dentro de su sistema de archivos depende en cierta medida del sistema operativo. En sistemas tipo Unix, los bits se pasan a través de su umaskconfiguración, que normalmente sería 022eliminar el permiso de escritura de "grupo" y "otro", o 002eliminar el permiso de escritura solo de "otro". También podría serlo 077si está especialmente preocupado por la privacidad y desea eliminar los permisos de lectura, escritura y ejecución de "grupo" y "otro".


1 Las versiones extremadamente tempranas de Git guardaron los permisos de grupo, de modo que algunos repositorios tienen entradas de árbol con modo 664. Modern Git no lo hace, pero como ninguna parte de ningún objeto se puede cambiar, esos viejos bits de permisos aún persisten en los viejos objetos de árbol.

El cambio para almacenar solo 0644 o 0755 estaba en commit e44794706eeb57f2 , que es anterior a Git v0.99 y data del 16 de abril de 2005.

torek
fuente
"Primeras versiones de Git" ¿Alguna idea de qué versiones exactas se ven afectadas por esto?
user5359531
2
@ user5359531 versiones anteriores a commit e44794706eeb57f2ee38ed1604821aa38b8ad9d2, es decir, anterior a Git versión 0.99.
torek