¿Cómo crear permisos de modo de ejecución de archivos en Git en Windows?

378

Yo uso Git en Windows, y quiero empujar el script de shell ejecutable al repositorio de git mediante un commit.

Por lo general, necesito hacer dos pasos ( git commit).

$ vi install.sh
$ git add install.sh  
$ git commit -am "add new file for installation" # first commit
[master f2e92da] add support for install.sh
 1 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 install.sh
$ git update-index --chmod=+x install.sh
$ git commit -am "update file permission"        # second commit
[master 317ba0c] update file permission
  0 files changed
  mode change 100644 => 100755 install.sh

¿Cómo puedo combinar estos dos pasos en uno solo? configuración de git? comando de windows?

Recuerde : dos respuestas son buenas, git add --chmod=+x filees compatible con la nueva versión de git

Referencia: consulte la pregunta en Permisos de archivos Git en Windows para la segunda confirmación

Larry Cai
fuente
10
Con git 2.9.x / 2.10 (Q3 2016), git add --chmod=+xes realmente posible. Vea mi respuesta a continuación , crédito a Edward Thomson .
VonC
55
git add --chmod=+x
Valdría la

Respuestas:

592

No es necesario hacer esto en dos confirmaciones, puede agregar el archivo y marcarlo como ejecutable en una única confirmación:

C:\Temp\TestRepo>touch foo.sh

C:\Temp\TestRepo>git add foo.sh

C:\Temp\TestRepo>git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

Como observa, después de agregar, el modo es 0644 (es decir, no ejecutable). Sin embargo, podemos marcarlo como ejecutable antes de confirmar:

C:\Temp\TestRepo>git update-index --chmod=+x foo.sh

C:\Temp\TestRepo>git ls-files --stage
100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

Y ahora el archivo está en modo 0755 (ejecutable).

C:\Temp\TestRepo>git commit -m"Executable!"
[master (root-commit) 1f7a57a] Executable!
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100755 foo.sh

Y ahora tenemos una única confirmación con un solo archivo ejecutable.

Edward Thomson
fuente
147

De hecho, sería bueno si git-addtuviera una --modebandera

git 2.9.x / 2.10 (Q3 2016) realmente permitirá eso (gracias a Edward Thomson ):

git add --chmod=+x -- afile
git commit -m"Executable!"

Eso hace que todo el proceso sea más rápido y funciona incluso si core.filemodeestá configurado en falso.

Ver commit 4e55ed3 (31 de mayo de 2016) por Edward Thomson ( ethomson) .
Ayudado por: Johannes Schindelin ( dscho) .
(Fusionada por Junio ​​C Hamano - gitster- en commit c8b080a , 06 jul 2016)

add: agregar --chmod=+x/ --chmod=-xopciones

El bit ejecutable no se detectará (y, por lo tanto, no se establecerá) para rutas en un repositorio con core.filemodeset a false, aunque es posible que los usuarios aún deseen agregar archivos como ejecutables para compatibilidad con otros usuarios que tienen core.filemode funcionalidad.
Por ejemplo, los usuarios de Windows que agregan scripts de shell pueden desear agregarlos como ejecutables para compatibilidad con usuarios que no son de Windows.

Aunque esto se puede hacer con un comando de plomería ( git update-index --add --chmod=+x foo), enseñar el git-addcomando permite a los usuarios establecer un archivo ejecutable con un comando con el que ya están familiarizados .

VonC
fuente
22

Si los archivos ya tienen establecido el indicador + x, git update-index --chmod=+xno hace nada y git piensa que no hay nada que confirmar, aunque el indicador no se guarde en el repositorio.

Primero debe eliminar la bandera, ejecutar el comando git y luego volver a colocar la bandera:

chmod -x <file>
git update-index --chmod=+x <file>
chmod +x <file>

entonces git ve un cambio y le permitirá confirmarlo.

Bohemio
fuente
10

La nota es, en primer lugar, debe asegurarse de filemodeestablecer falseen el archivo de configuración git, o usar este comando:

git config core.filemode false

y luego puede establecer el permiso 0777 con este comando:

git update-index --chmod=+x foo.sh
Nabi KAZ
fuente
3

No tengo touchy chmodcomando en mi cmd.exe y git update-index --chmod=+x foo.shno funciona para mí.

Finalmente lo resuelvo estableciendo skip-worktreebit:

git update-index --skip-worktree --chmod=+x foo.sh
khiav reoy
fuente