Как восстановить права доступа к файлу для того, что git "думает", что файл должен быть?
У меня есть git checkout. Все разрешения на файлы отличаются от того, что git думает, что они должны быть, поэтому все они отображаются как измененные.
не касаясь содержимого файлов (просто хочу изменить разрешения) как мне установить все разрешения файлов на то, что git думает, что они должны быть?
8 ответов:
Git отслеживает filepermission и предоставляет изменения разрешений при создании патчей с помощью
git diff -p. Так что все что нам нужно это:
- создать обратный патч
- включить только изменения разрешений
- применить патч к нашей рабочей копии
как один-лайнер:
git diff -p -R --no-color \ | grep -E "^(diff|(old|new) mode)" --color=never \ | git applyвы также можете добавить его в качестве псевдонима в свой git config...
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, в противном случае он будет заменен на последний вы сбежали.Thx to @Mixologic для указания на это, просто используя
-Rongit diffгромоздкаяsedкоманда больше не требуется.
попробовать
git config core.fileMode falseПримечание:
core.fileModeи регистр!С
git configна странице:
core.fileModeесли false, исполняемые разрядные различия между индексом и рабочей копией игнорируются; полезно для сломанных файловых систем, таких как FAT. Смотрите git-update-index (1).
значение по умолчанию true, за исключением git-clone(1) или git-init (1) будет зондировать и устанавливать ядро.содержит filemode false, если это необходимо при создании репозитория.
Git не хранит разрешения на файлы, кроме исполняемых сценариев. Рассмотрите возможность использования чего-то вроде git-cache-meta для сохранения прав собственности на файлы и разрешений.
Git может хранить только два типа режимов: 755 (исполняемый файл) и 644 (не исполняемый файл). Если ваш файл был 444 git будет хранить он имеет 644.
git diff -p \ | grep -E '^(diff|old mode|new mode)' \ | sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \ | git applyбудет работать в большинстве случаев, но если у вас есть внешние инструменты diff, такие как meld, вы должны добавить --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был нужен в моей ситуации
вы также можете попробовать до/после проверки крюк может сделать трюк.
посмотреть: Настройка Git-Git Крючки
самое простое, что нужно сделать, это просто изменить разрешения обратно. Как отметил @kroger git отслеживает только исполняемые биты. Так что вам, вероятно, просто нужно запустить
chmod -x filenameчтобы исправить это (или+xесли это то, что нужно.
git diff -pв muhqu это могут отображаться не все расхождения.
- видел это в Cygwin для файлов, которыми я не владел
- изменения режима полностью игнорируются, если
core.filemode- этоfalse(который является значением по умолчанию для MSysGit)этот код считывает метаданные напрямую:
(set -o errexit pipefail nounset; git ls-tree HEAD -z | while read -r -d $'' 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",, || die }'(кредит для "$ '\0'" идет http://transnum.blogspot.ru/2008/11/bashs-read-built-in-supports-0-as.html)
The
etckeeperинструмент может обрабатывать разрешения и с:etckeeper init -d /mydirвы можете использовать его для других dirs, чем
/etc.установить с помощью диспетчера пакетов или получить источники из ссылки выше.