Обновление и фиксация только прав доступа к файлу с помощью контроля версий git

187

Просто превратил some.shфайл в исполняемый файл ( chmod 755 ...), разрешения были обновлены, но не содержимое. Есть ли способ зафиксировать файл в git, чтобы исполняемый бит был восстановлен / установлен на clone / checkout / pull ?

Обновление: как я могу отследить, что новые разрешения были отправлены github?

BreakPhreak
источник

Ответы:

190

По умолчанию git обновит права доступа к исполняемому файлу, если вы их измените. Он не будет изменять или отслеживать любые другие разрешения.

Если вы не видите никаких изменений при изменении прав на выполнение, у вас, вероятно, есть конфигурация в git, которая игнорирует режим файлов.

Посмотрите на ваш проект, в .gitпапке для configфайла, и вы должны увидеть что-то вроде этого:

[core]
    filemode = false

Вы можете изменить его на trueваш любимый текстовый редактор или запустить:

git config core.filemode true

Тогда вы сможете нормально фиксировать ваши файлы. Это только передаст изменения разрешения.

Винсент Б.
источник
Спасибо! Как я могу отследить, что изменения разрешений были представлены github?
BreakPhreak
2
Вы можете увидеть это при просмотре файла (например, в файле Rails gitignore вы найдете 100644 в качестве разрешения для файла)
Винсент Б.
8
Изменение разрешений в Windows с помощью git (собственно изменение разрешений и фиксаций
fooMonster
39
Этот ответ неверен! Git отслеживает только исполняемый файл или нет. Он не отслеживает другие права доступа к файлам, такие как запись или чтение. Прочитайте stackoverflow.com/a/11231682/2311074 для получения дополнительной информации.
Адам
Для меня webstorm не уловил изменения, но git statusя вижу изменения ..
Townsheriff
193

@fooMonster статья работала на меня

# git ls-tree HEAD
100644 blob 55c0287d4ef21f15b97eb1f107451b88b479bffe    script.sh

Как видите, файл имеет разрешение 644 (без учета 100). Мы хотели бы изменить его на 755:

# git update-index --chmod=+x script.sh

зафиксировать изменения

# git commit -m "Changing file permissions"
[master 77b171e] Changing file permissions
0 files changed, 0 insertions(+), 0 deletions(-)
mode change 100644 => 100755 script.sh
ewwink
источник
7
Следует отметить, что вы на самом деле должны использовать '-x / + x'. Вы не можете устанавливать какие-либо другие разрешения или битовую маску.
Деволус
использование заметок git commit -aничего не сделало для меня, однако настройка сообщения в командной строке сделала. Немного
странности
Порядок команды должен быть следующим: # git update-index --chmod=+x script.sh # git ls-tree HEAD # git commit -m "Changing file permissions" # git push
SimonDepelchin
30

Не работает для меня

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

git init
git add dir/file
chmod 440 dir/file
git commit -a

Кажется, проблема в том, что git распознает только определенные изменения прав доступа.

Otheus
источник
51
Правильно - gitдействительно только отслеживает, является ли файл исполняемым или нет, а не полный набор разрешений * nix. Таким образом, вам придется переключать файл между исполняемым файлом / не для того, чтобы он думал, что вы изменили что-то, что стоит совершить ...
twalberg
Я не смог найти документацию, которая была бы ясна: какой триггер пост-действия я могу использовать, возможно, для того, чтобы соответствующим образом настроить пермиты?
Отей
2
Ну, есть post-checkoutзацепка git, которая бы охватывала некоторые случаи, но я не уверен, охватит ли это все возможные вещи, которые обновляют файлы в вашем рабочем дереве. Возможно, вам лучше иметь в своем репозитории дополнительный сценарий оболочки, который устанавливает все соответствующим образом. Кроме того, есть пара проектов, которые дополняют gitвозможности хранения метаданных, но я никогда не пробовал ни одного из них ...
twalberg
1
Я изменил права доступа к файлу на 777 и сделал git update-index --refresh, но разница показывает old mode 100644 new mode 100755. Он не
обновил
см. ответ @tishma здесь stackoverflow.com/questions/14557106/… . Это то, что у меня
сработало