¿Cómo recuperar los permissions del file a lo que git "piensa" que debería ser el file?

Tengo un pago por git. Todos los permissions de files son diferentes de lo que git cree que deberían ser, por lo tanto, todos aparecen como modificados.

Sin tocar el contenido de los files (solo quiero modificar los permissions) ¿cómo configuro todos los permissions de los files para lo que git cree que deberían ser?

Git realiza un seguimiento de la autorización de files y expone los cambios de permissions al crear parches usando git diff -p . Entonces todo lo que necesitamos es:

  1. crear un parche inverso
  2. include solo los cambios de permiso
  3. aplicar el parche a nuestra copy de trabajo

Como un trazador de líneas:

 git diff -p -R --no-color \ | grep -E "^(diff|(old|new) mode)" --color=never \ | git apply 

también puedes agregarlo como un alias a tu configuration de git …

 git config --global --add alias.permission-reset '!git diff -p -R --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply' 

… y puedes invocarlo a través de:

 git permission-reset 

Tenga en count que si shell es bash , asegúrese de usar comillas ' lugar de " alnetworkingedor de !git , de lo contrario, se sustituirá por el último command git que ejecutó.

Thx to @Mixologic para señalar que simplemente usando -R en git diff , el engorroso command sed ya no es necesario.

Prueba git config core.filemode false

Desde la página man de git config :

core.fileMode

Si es falso, las diferencias de bits ejecutables entre el índice y la copy de trabajo se ignoran; útil en filesystems rotos como FAT. Ver git-update-index (1) .

El valor pnetworkingeterminado es verdadero, excepto git-clone (1) o git-init (1) sondeará y establecerá core.fileMode false si es apropiado cuando se crea el repository.

Git no almacena permissions de files que no sean secuencias de commands ejecutables. Considere usar algo como git-cache-meta para save la propiedad y los permissions del file.

Git solo puede almacenar dos types de modos: 755 (ejecutable) y 644 (no ejecutable). Si tu file era 444 git lo almacenaría tiene 644.

 git diff -p \ | grep -E '^(diff|old mode|new mode)' \ | sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \ | git apply 

funcionará en la mayoría de los casos, pero si tiene herramientas externas de diferencia como meld instalado, tiene que agregar –no-ext-diff

 git diff --no-ext-diff -p \ | grep -E '^(diff|old mode|new mode)' \ | sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \ | git apply 

fue necesario en mi situación

Lo más fácil es cambiar los permissions nuevamente. Como @kroger notó que git solo rastrea los bits ejecutables. Por lo tanto, probablemente solo necesite ejecutar chmod -x filename para corregirlo (o +x si eso es lo que necesita.

También podría intentar un gancho de pago anterior / posterior que podría hacer el truco.

Ver: Personalizar Git – Git Hooks

git diff -p usado en la respuesta de muhqu puede no mostrar todas las discrepancias.

  • vi esto en Cygwin para files que no poseía
  • los cambios de modo se ignoran por completo si core.filemode es false (que es el pnetworkingeterminado para MSysGit)

Este código lee los metadatos directamente en su lugar:

 (set -o errexit pipefail nounset; git ls-tree HEAD -z | while read -r -d $'\0' mask type blob path do if [ "$type" != "blob" ]; then continue; fi; case "$mask" in #do not touch other bits 100644) chmod ax "$path";; 100755) chmod a+x "$path";; *) echo "invalid: $mask $type $blob\t$path" >&2; false;; esac done) 

Un trazador de líneas de un grado no de producción (reemplaza las máscaras por completo):

 git ls-tree HEAD | perl -ne '/^10(0\d{3}) blob \S+\t(.+)$/ && { system "chmod",$1,$2 || die }' 

(El crédito por "$ '\ 0'" va a http://transnum.blogspot.ru/2008/11/bashs-read-built-in-supports-0-as.html )

La herramienta etckeeper puede manejar permissions y con:

 etckeeper init -d /mydir 

Puede usarlo para otros directorys que /etc

Instale usando su administrador de packages u obtenga las fonts del enlace anterior.