Как восстановить права доступа к файлам и каталогам в 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
был необходим в моей ситуации
Ответ 5
Вы также можете попробовать, чтобы крюк pre/post checkout мог сделать трюк.
Смотрите: Пользовательская настройка Git - Git Крючки
Ответ 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)суб >
Ответ 8
Инструмент etckeeper
может обрабатывать разрешения и с помощью:
etckeeper init -d /mydir
Вы можете использовать его для других дисков, чем /etc
.
Установите с помощью диспетчера пакетов или получите исходные данные из указанной выше ссылки.