Problema de Git chmod: bit ejecutivo de tornillos de pago

Problema de Git chmod: bit ejecutivo de tornillos de pago

En Ubuntu y Debian, los últimos archivos confirmados obtienen el bit de ejecución configurado cuando intento realizar el pago posterior. 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 de cuándo y por qué se introduce el bit de ejecución? core.filemodese establece en true.

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

Anexo 1:Es la caja, donde se estropean 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 de este repositorio que confirmo. Después de la confirmación exitosa, no puedo cambiar de rama sin el error de permiso.

Respuesta1

No soy usuario de Git, pero creo que Git almacena toda la máscara de permisos del archivo.

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

Para hacer que Git ignore dichos cambios, use

git config core.filemode false

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

Respuesta2

¿Verificó si hay un enlace personalizado que se ejecuta durante la confirmación o el pago? Es posible que haya algunos ganchos personalizados que alteren sus archivos. Revisar lapágina de manual de githooks.

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

Respuesta3

¿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ás cambiando los permisos en main y luego eliminando la rama de desarrollo que tiene el permiso incorrecto, afectando tu permiso local. Luego intenta comprometerte de nuevo. ya sea clonar, cambiar, confirmar, fusionar; o intente cambiar el archivo individualmente con una única confirmación de archivo en dev y luego fusione

Respuesta4

Hay buenas respuestas en estos enlaces.

https://stackoverflow.com/questions/9027584/how-to-change-the-file-mode-on-github

y

https://stackoverflow.com/questions/1611211/how-do-i-make-git-accept-mode-changes- without-accepting-all-text-changes

Básicamente, es necesario git update-index --chmod=(+|-)x <file>y esto agregará un cambio que luego deberá confirmar y presionar para agregar o eliminar los permisos.

información relacionada