2009-08-10 11 views
500

Por alguna razón, cuando inicialmente hice una extracción del repositorio para un proyecto mío git, obtuve un montón de archivos en mi copia de trabajo que no tienen cambios perceptibles en ellos, pero siguen apareciendo en mi área unstaged changes .¿Cómo elimino los archivos que dicen "modo antiguo 100755 nuevo modo 100644" de cambios no realizados en Git?

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

old mode 100755 
new mode 100644 

¿Alguien sabe lo que esto significa?

¿Cómo puedo obtener estos archivos de mi lista de cambios sin registrar? (Es muy molesto tener que ir a través de cientos de archivos, solo para seleccionar los archivos que he editado recientemente y quiero comprometer).

Respuesta

850

que se parece a UNIX modos de permisos de archivo para mí (= 755rwxr-xr-x, 644 = rw-r--r--) - el modo de edad incluyó el indicador x (ejecutable) +, el nuevo modo no lo hace.

This msysgit issue's replies sugiere establecer core.filemode a falsa con el fin de deshacerse de la cuestión:

git config core.filemode false 
+95

+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 forma que pueda leer). Cuando vuelve a leer el estado de esos archivos, parece que el bit ejecutable se ha desactivado deliberadamente. Establecer core.filemode en falso le dice a git que ignore cualquier cambio de bit ejecutable en el sistema de archivos, por lo que no lo verá como un cambio. Si necesita escenificar un cambio de bit ejecutable, significa que debe hacer 'git update-index --chmod = (+ | -) x ' manualmente. –

+3

Si, como yo, los cambios de modo son importantes, puede establecer core.filemode en false, confirmar los cambios en el código real, y luego establecer core.filemode en true y git preservará los cambios del archivo. –

+8

Tengo el mismo problema, pero fue debido al uso de la misma reproducción git a través de la línea SSH git cmd, y a través de extensiones Git en una unidad asignada en Windows. . . La solución era la misma, agregada a "config" [core] filemode = false –

6

Usted podría intentar restablecer git CABEZA --hard para restablecer el repositorio al estado predeterminado esperado.

+4

Si git no pudo establecer el bit ejecutable correctamente/de forma consistente después de una extracción, no va a mejorar después de un reinicio. –

+0

De esta manera funciona muy bien para un repositorio copiado donde la copia ha volteado la bandera. – AndrewCr

+1

+1 funcionó, mi error fue chmod 777 a la carpeta .git – jimy

73

Configurar core.filemode en false funciona. Pero se aseguraría de que las configuraciones en ~/.gitconfig no sean anuladas por aquellos en .git/config.

+2

estado allí, hecho eso. Tristemente encontré tu comentario solo después de haber resuelto el problema yo mismo. Aún así, +1! –

+1

Si otros usuarios clonan este proyecto están en Windows, podría ser mejor simplemente aplicar el cambio al archivo '~/.gitconfig'! –

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

Tenía el único archivo problemático con los permisos cambiados. Para volver a enrollarlo individualmente, lo eliminé manualmente con rm <file> y luego hice un checkout para extraer una nueva copia.

Afortunadamente aún no lo había organizado.

Si tuviera que podría haber corrido git reset -- <file> antes de ejecutar git checkout -- <file>

0

Esto sucede cuando se tire y todos los archivos eran ejecutable en el repositorio remoto. Hacerlos ejecutables de nuevo volverá a poner todo en orden.

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

Es posible que tenga que hacer:

chmod -x <file> // Removes execute bit 

en cambio, para los archivos que no se ha establecido como ejecutable y que fue cambiado debido a la operación anterior. Hay una mejor manera de hacerlo, pero esto es solo una solución muy rápida y sucia.

3

He encontrado este problema al copiar un git repo 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 anterior a la nueva.El largo y corto de él es, ejecute los siguientes comandos para enderezar las cosas (thanks to this superuser answer):

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

El ex comando realmente resolver las diferencias que informaron git diff, pero habrá revocar su capacidad de enumerar los directorios, por lo que ls ./ falla con ls: .: Permission denied. Para corregir esto:

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

La mala noticia es que si usted tiene los archivos que desea mantener ejecutable, tales como .sh guiones, tendrá que volver a ellos. 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 
+1

¡Gracias, me han ayudado mucho! También se debe verificar que 'git config core.filemode' esté establecido en' true'; de lo contrario, no se detectarán cambios de permisos. También necesitaba actualizar el índice de git después de cada cambio para recogerlo. –

+0

Esta solución es la más segura si le preocupan las dependencias afectadas. –

Cuestiones relacionadas