Problema de git chmod: la comprobación atornilla el bit exec

10

En Ubuntu y Debian, los últimos archivos comprometidos obtienen el bit de ejecución establecido, cuando intento realizar el pago después. Es bastante extraño y me vuelve loco:

$ 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

¿Alguien tiene una idea, cuándo y por qué se desliza el bit de ejecución? core.filemodeestá ajustado a true.

Tengo el archivo abierto en vim durante el cambio de rama, si eso es importante de alguna manera.

Anexo 1: Es el proceso de pago, donde se arruinan los permisos. Puedo jugar el juego una y otra vez:

$ 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.

Anexo 2: Esto sucede, por cierto, para cada archivo en este repositorio, que confirmo. Después de la confirmación exitosa, no puedo cambiar las ramas sin el permiso de arruinar.

Boldewyn
fuente
¿Ha verificado los permisos en el paso de # aparentemente todo bien ...
RobotHumans
Estoy de acuerdo aquí En dev-branch, 'git-log master ... HEAD - file' y vea si algo ha cambiado entre la rama y ahora en ese archivo.
yuriismaster el
@ aking1012: Sí, en ese momento los modos de archivo ya cambiaron. Actualizaré la pregunta.
Boldewyn el
@yuriismaster: git-logno muestra ningún resultado, para ninguna combinación de master, dev-brancho HEAD(lo cual es extraño, ¿no? ¿No debería el comando imprimir el último mensaje de confirmación master?)
Boldewyn
2
¿En qué sistema de archivos estás?
bitmask el

Respuestas:

12

No soy un usuario de Git, pero creo que Git almacena la máscara de permisos de archivos completa.

Eso significa que una vez que configuró el archivo como ejecutable, que Git recogió y replicó en el repositorio. Por lo tanto, debe cambiar la máscara de permisos del archivo antes de confirmar.

Para hacer que Git ignore dichos cambios, use

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.
harrymc
fuente
1
En realidad, trato de comprometer los archivos con los permisos correctos. Incluso volví a comprometer todos los archivos después de modificarlos. Como trabajo en Windows de vez en cuando (no con este repositorio), lo sé core.fileMode, pero esperaba poder dejarlo true.
Boldewyn el
Incluso podría ser un error en git cuando se trabaja en lo que llaman "sistemas de archivos rotos". No hay sistemas de archivos rotos, solo software roto.
harrymc
44
Tengo que estar de acuerdo con los desarrolladores de
GIT
3
OK, era el sistema de archivos. No pude reproducirlo en otra máquina, donde el directorio está montado a través de NFS. En la máquina principal es, como dije, CIFS. Cuando pregunté en la lista de correo de git, obtuve la respuesta, que CIFS está roto con respecto a los bits de ejecución. ¡Maldito!
Boldewyn el
3

¿Verificó si hay un enlace personalizado que se ejecuta durante la confirmación o el pago? Puede haber algunos ganchos personalizados que alteren sus archivos. Consulte la página de manual de githooks .

Los ganchos son básicamente pequeños programas llamados por git en ciertos eventos (commit, checkout, etc.).

Bandi
fuente
Buen intento, pero mi .git/hooksdirectorio está intacto.
Boldewyn el
1

¿Has probado el archivo git commit -m 'mode is 644' en la rama dev-branch

para mí parece que lo que está sucediendo es que está cambiando los permisos en main y luego bajando la rama de desarrollo que tiene el permiso incorrecto, bloqueando su permiso local. luego tratando de comprometerse de nuevo. ya sea clonar, cambiar, comprometer, fusionar; o intente cambiar el archivo individualmente con un solo archivo, confirme en dev y luego combine

RobotHumanos
fuente
1
En realidad, nunca toco los permisos en el escenario original. Todos los cambios de permisos se realizan mediante git en el paso 'finalizar compra'.
Boldewyn el
... es decir, hice algo chmoduna vez en los archivos, pero desafortunadamente no puedo recordar si el problema comenzó a ocurrir inmediatamente después. Creo que no fue así.
Boldewyn el
Traté de replicar tu problema y no puedo
RobotHumans
Eso es porque no trabajas en un CIFS montado ;-). Olvidé el +1 para el intento, ¡gracias!
Boldewyn