¿Cómo se quita archivos diciendo “viejo modo de 100755 100644 nuevo modo” de los cambios en unstaged Git?
Pregunta
Por alguna razón, cuando al principio me hice un tirón desde el repositorio git para un proyecto de la mina,
Tengo un montón de archivos en mi copia de trabajo que no tienen cambios discernibles que se les hagan, pero siguen apareciendo en mi área unstaged changes
.
Estoy usando Git Gui en Windows XP, y cuando ir a buscar en 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 fuera de mi lista de cambios unstaged? (Muy molesto tener que pasar por 100 de los archivos, sólo para escoger los archivos que he editado recientemente y quiere comprometerse).
Solución
Eso se parece a los permisos de archivo UNIX modos a mí (755
= rwxr-xr-x
, 644
= rw-r--r--
) -. El modo antiguo incluido la bandera x (ejecutable) +, el nuevo modo no
respuestas de esta edición msysgit propone la creación core.filemode en false en el fin de deshacerse del problema:
git config core.filemode false
Otros consejos
Configuración core.filemode
en false funciona, pero asegúrese de que los ajustes en ~/.gitconfig
no están siendo anulados por los de .git/config
.
Me he encontrado con este problema al copiar un repositorio git con archivos de trabajo de un viejo disco duro un par de veces. El problema se deriva del hecho de que el propietario y permisos cambiados de la unidad antigua / máquina para el nuevo. El largo y corto de él es, ejecute los siguientes comandos para enderezar las cosas ( gracias a esta respuesta superusuario ):
sudo chmod -R -x . # remove the executable bit from all files
El ex comando realmente resolver las diferencias que informaron git diff, pero revocará su capacidad de enumerar los directorios, por lo 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 scripts .sh
, 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
Parece que han 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 .
Usted podría intentar git reset CABEZA --hard para restablecer el repositorio al estado predeterminado esperado.
Esto sucede cuando se tire y todos los archivos eran ejecutable en el repositorio remoto. Haciéndolos ejecutable volverán a poner todo de vuelta a la normalidad de nuevo.
chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder
Es posible que tenga que ver:
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 hacer esto, pero esto es sólo una solución muy rápida y sucia.
Me he enfrentado a la misma cuestión. Y esto a salvar mi vida: https://gist.github.com/jtdp/5443498
git diff -p -R --no-color \
| grep -E "^(diff|(old|new) mode)" --color=never \
| git apply
Por lo general ocurre cuando se clona el repositorio entre Windows y Linux / Unix.
Sólo decirle a Git que ignore el cambio fileMode, aquí hay varias maneras:
-
Config SOLO para repo actual:
git config core.filemode false
-
Configuración global:
git config --global core.filemode false
-
Añadir en ~ / .gitconfig:
[core] filemode = false
Sólo tienes que seleccionar uno de ellos.
Yo tenía sólo el archivo problemático con los permisos modificados.
Para rodar de nuevo de forma individual, que acaba de eliminar de forma manual con rm <file>
y luego hice una obtención para tirar de una nueva copia.
Por suerte no había montado todavía.
Si tuviera que podría haber corrido git reset -- <file>
antes de ejecutar git checkout -- <file>
Me acabo de encontrar con este problema cuando se diferencia mi rama con maestría. Git devolvió un error 'modo' cuando esperaba mi sucursal sea idéntica a dominar. Me fijo eliminando el archivo y luego la fusión de maestro de nuevo.
En primer lugar me corrió el diff:
git checkout my-branch
git diff master
Esto volvió:
diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644
Entonces encontré lo siguiente para corregir:
rm bin/script.sh
git merge -X theirs master
Después de esto, no hay ningún git diff
diferencias entre mi-sucursal y maestro.
Puede utilizar el siguiente comando para cambiar el modo de archivo de nuevo.
git add --chmod=+x -- filename
A continuación, se comprometan a la rama.