Как восстановить права доступа к файлам и каталогам в git, если они были изменены?

У меня есть git checkout. Все права доступа к файлам отличаются от того, что git считает, что они должны быть поэтому, все они отображаются как измененные.

Не касаясь содержимого файлов (просто хотите изменить разрешения), как я могу установить все разрешения на файлы для того, что git считает, что они должны быть?

Ответ 1

Git отслеживает передачу файлов и предоставляет изменения разрешений при создании патчей с использованием git diff -p. Итак, все, что нам нужно, это:

  • создать обратный патч
  • включают только изменения разрешений
  • примените патч к нашей рабочей копии.

Как однострочный:

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

вы также можете добавить его как псевдоним в конфигурацию git...

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

... и вы можете вызвать его через:

git permission-reset

Обратите внимание, что если оболочка bash, используйте ' вместо " кавычек вокруг !git, в противном случае она заменяется последней командой git, которую вы запускали.

спасибо to @Mixologic, указав, что просто используя -R на git diff, более громоздкая команда sed больше не требуется.

Ответ 2

Попробуйте git config core.fileMode false

Со страницы git config :

core.fileMode

Если false, различия в исполняемых битах между индексом и рабочей копией игнорируются; полезно на сломанных файловых системах, таких как FAT. Смотрите git-update-index (1).

Значение по умолчанию - true, за исключением того, что git-clone (1) или git-init (1) будут проверять и устанавливать core.fileMode false, если необходимо, при создании хранилища.

Ответ 3

Git не сохраняет права доступа к файлам, кроме исполняемых скриптов. Для сохранения прав собственности и прав на файл используйте git -cache-meta.

Git может хранить только два типа режимов: 755 (исполняемый) и 644 (не исполняемый). Если ваш файл был 444 git, он будет иметь 644.

Ответ 4

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

будет работать в большинстве случаев, но если у вас есть внешние инструменты сравнения, такие как meld installed, вы должны добавить --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

был необходим в моей ситуации

Ответ 6

Самый простой способ - просто изменить права доступа. Как отметил @kroger, git отслеживает только исполняемые биты. Поэтому вам просто нужно запустить chmod -x filename, чтобы исправить его (или +x, если это необходимо.

Ответ 7

git diff -p, используемый в ответе muhqu, может не отображаться все несоответствия.

  • увидел это в Cygwin для файлов, которые я не имел. Изменения режима
  • полностью игнорируются, если core.filemode - false (который по умолчанию используется для MSysGit)

Этот код считывает метаданные напрямую:

(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 a-x "$path";;
    100755) chmod a+x "$path";;
    *) echo "invalid: $mask $type $blob\t$path" >&2; false;;
    esac
done)

Не-производственный однострочный (полностью заменяет маски):

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

(Кредит для $'\ 0' "переходит в http://transnum.blogspot.ru/2008/11/bashs-read-built-in-supports-0-as.html)суб >