¿Cómo elimino los archivos que dicen "modo antiguo 100755 nuevo modo 100644" de los cambios no organizados en Git?

723

Por alguna razón, cuando inicialmente hice una extracción del repositorio para un proyecto de git mío, obtuve una tonelada de archivos en mi copia de trabajo que no tienen cambios perceptibles, pero siguen apareciendo en mi unstaged changesárea.

Estoy usando Git Gui en Windows xp, y cuando voy a mirar el archivo para ver qué ha cambiado. Todo lo que veo es:

old mode 100755  
new mode 100644  

Alguien sabe que significa esto?

¿Cómo puedo sacar estos archivos de mi lista de cambios no organizados? (Muy molesto tener que pasar por cientos de archivos, solo para elegir los archivos que he editado recientemente y quiero comprometer).

concepto47
fuente

Respuestas:

1286

Eso me parece modos de permisos de archivos Unix ( 755= rwxr-xr-x, 644= rw-r--r--): el modo anterior incluía la bandera + x (ejecutable), el nuevo modo no.

Las respuestas de este problema de msysgit sugieren establecer core.filemode en false para deshacerse del problema:

git config core.filemode false
Ámbar
fuente
132
+1. Esto significa que git piensa que puede establecer correctamente el bit ejecutable en los archivos desprotegidos, pero cuando intenta hacerlo no funciona (o al menos no de una manera que pueda leer). Cuando luego vuelve a leer el estado de esos archivos, parece que el bit ejecutable se ha desarmado deliberadamente. Establecer core.filemode en false le dice a git que ignore cualquier cambio de bit ejecutable en el sistema de archivos para que no lo vea como un cambio. Si necesita realizar un cambio de bit ejecutable, significa que debe hacerlo manualmente git update-index --chmod=(+|-)x <path>.
CB Bailey
77
Si, como yo, los cambios de modo son importantes, puede establecer core.filemode en falso, confirmar los cambios de código reales y luego establecer core.filemode en verdadero y git preservará los cambios del archivo.
Michael T. Smith
8
Tengo el mismo problema, ¡pero fue debido al uso del mismo git repro a través de la línea SSH git cmd, y a través de Git Extensions en una unidad asignada en Windows! . . La solución fue la misma, agregada en "config" [core] filemode = false
Ian Vaughan
2
Eso fue un salvavidas, gracias señor! Esto me sucedió en OSX, después de que compartí un repositorio clonado en la carpeta pública y cambié los permisos para los archivos.
Thiago Ganzarolli
8
@robsch Puede usar git config --global ...para configurar la opción en su archivo de configuración global.
Ámbar
98

Configuración core.filemodede falsa funciona, pero asegúrese de que las configuraciones en ~/.gitconfigque no están siendo anulado por los de .git/config.

NovelX
fuente
3
He estado allí, hecho eso. Lamentablemente encontré tu comentario solo después de haber resuelto el problema yo mismo. Aún así, +1!
David Schmitt
1
Si otros usuarios clonan este proyecto en Windows, ¡sería mejor aplicar el cambio al ~/.gitconfigarchivo!
Ian Vaughan
Si desea verificar en Windows Powershell. git config --list --show-origin | sls filemodeo en Linux git config --list --show-origin | grep filemode. Esto le mostrará dónde necesita hacer los ajustes.
Frank Fu
¡¡Lo lograste!! Bien hecho.
Kim
27

He encontrado este problema al copiar un repositorio de git con archivos de trabajo de un disco duro viejo un par de veces. El problema surge del hecho de que el propietario y los permisos cambiaron de la unidad / máquina antigua a la nueva. En resumen, ejecute los siguientes comandos para enderezar las cosas ( gracias a esta respuesta del superusuario ):

sudo chmod -R -x . # remove the executable bit from all files

El primer comando en realidad resolverá las diferencias que informó git diff, pero revocará su capacidad para enumerar los directorios, por lo que ls ./falla ls: .: Permission denied. Para arreglar eso:

sudo chmod -R +X . # add the executable bit only for directories

La mala noticia es que si tiene algún archivo que desee mantener ejecutable, como .shscripts, deberá revertirlos. Puede hacerlo con el siguiente comando para cada archivo:

chmod +x ./build.sh # where build.sh is the file you want to make executable again
Scott Willeke
fuente
2
Gracias, me ayudo mucho! También se debe verificar que git config core.filemodeesté configurado en true, de lo contrario no se detectarán cambios en los permisos. También necesitaba actualizar el índice git después de cada cambio para recogerlo.
pat-s el
Esta solución es la más segura si le preocupan las dependencias afectadas.
Jin
9

Por lo general, ocurre cuando el repositorio se clona entre máquinas Windows y Linux / Unix.

Solo dile a git que ignore el cambio en el modo de archivo, aquí hay varias maneras:

  1. Configuración SOLO para el repositorio actual:

    git config core.filemode false
    
  2. Configuración global:

    git config --global core.filemode false
    
  3. Agregue ~ / .gitconfig:

    [core]
         filemode = false
    

Solo selecciona uno de ellos.

K. símbolo
fuente
La configuración global no funciona porque (supongo) git crea un repositorio con estas opciones establecidas en verdadero (he creado un repositorio en Linux)
Herrgott
4

Parece que ha cambiado algunos permisos del directorio. Hice los siguientes pasos para restaurarlo.

$  git diff > backup-diff.txt                ### in case you have some other code changes 

$  git checkout .
SuperNova
fuente
3

Puede intentar git reset --hard HEAD para restablecer el repositorio al estado predeterminado esperado.

Doppelganger
fuente
8
Si git no pudo establecer el bit ejecutable correctamente / consistentemente después de una extracción, no será mejor después de un reinicio.
CB Bailey
2
Moví algunos proyectos a una unidad usb (fat32) y de nuevo a mi máquina ubuntu (ext4) y terminé con un montón de archivos modificados, bueno, los atributos. git reset --hard HEADFuncionó perfectamente para mí. gracias
cirovladimir
77
-1. OP dice "solo para seleccionar los archivos que he editado recientemente y quiero comprometer". Esto eliminaría esas ediciones también.
whitfin
99
-1 Sugerir este comando en git es similar a decir "puedes simplemente rm -rf ./, estoy seguro de que no tendrá consecuencias no deseadas".
Kzqai
1
No, esto no ayuda y este es el problema. Restablece y limpia y aún el estado de git muestra los cambios de modo. Este es un problema grave con Windows Git y creo que debería solucionarse, no simplemente evitar ignorando el modo de archivo.
vezenkov
1

Esto sucede cuando extrae y todos los archivos eran ejecutables en el repositorio remoto. Hacerlos ejecutables nuevamente restablecerá todo a la normalidad nuevamente.

chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder

Es posible que deba hacer:

chmod -x <file> // Removes execute bit

en cambio, para archivos que no se establecieron como ejecutables y que se modificaron debido a la operación anterior. Hay una mejor manera de hacer esto, pero esta es solo una solución rápida y sucia.

IskandarG
fuente
1

Puede usar el siguiente comando para volver a cambiar el modo de archivo. git add --chmod=+x -- filename Luego comprométete con la rama.

Wae
fuente
0

Solo tenía un archivo problemático con los permisos modificados. Para revertirlo individualmente, simplemente lo eliminé manualmente rm <file>y luego realicé un pago para obtener una copia nueva.

Por suerte aún no lo había puesto en escena.

Si lo hubiera hecho, podría haber corrido git reset -- <file>antes de corrergit checkout -- <file>

kEnobus
fuente
0

Me encontré con este problema al diferenciar mi rama con master. Git devolvió un error de 'modo' cuando esperaba que mi rama fuera idéntica a la maestra. Lo arreglé eliminando el archivo y luego fusionando master nuevamente.

Primero ejecuté el diff:

git checkout my-branch
git diff master

Esto regresó:

diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644

Luego ejecuté lo siguiente para solucionarlo:

rm bin/script.sh
git merge -X theirs master

Después de esto, git diffno devolvió diferencias entre my-branch y master.

Collin Krawll
fuente