Ответы:
Согласно официальной документации , вы можете установить или удалить флаг «исполняемый» для любого отслеживаемого файла с помощью update-indexподкоманды.
Чтобы установить флаг, используйте следующую команду:
git update-index --chmod=+x path/to/file
Чтобы удалить его, используйте:
git update-index --chmod=-x path/to/file
Под капотом
Хотя это похоже на обычную систему разрешения файлов Unix, на самом деле это не так. Git поддерживает специальный «режим» для каждого файла во внутренней памяти:
100644 для обычных файлов100755 для исполняемыхВы можете визуализировать это, используя ls-fileподкоманду, с --stageопцией:
$ git ls-files --stage
100644 aee89ef43dc3b0ec6a7c6228f742377692b50484 0 .gitignore
100755 0ac339497485f7cc80d988561807906b2fd56172 0 my_executable_script.sh
По умолчанию, когда вы добавляете файл в репозиторий, Git будет пытаться учитывать атрибуты его файловой системы и соответственно устанавливать правильный режим файла. Вы можете отключить это, установив core.fileModeпараметр в false:
git config core.fileMode false
Исправление проблем
Если в какой-то момент файловый режим Git не установлен, но файл имеет правильный флаг файловой системы, попробуйте удалить режим и установить его снова:
git update-index --chmod=-x path/to/file
git update-index --chmod=+x path/to/file
бонус
Начиная с Git 2.9, вы можете создать файл И установить флаг одной командой:
git add --chmod=+x path/to/file
Ответ Antwane является правильным, и это должен быть комментарий, но комментарии не имеют достаточно места и не позволяют форматирование. :-) Я просто хочу добавить, что в Git записываются только права доступа к файлам 1 или как 644или 755(пишется ( 100644и 100755, а 100часть средств «обычный файл»):
diff --git a/path b/path
new file mode 100644
Первый - 644 - означает, что файл должен не быть исполняемым, а второй означает, что он должен быть исполняемым. То, как это превращается в реальные файловые режимы в вашей файловой системе, зависит от ОС. В Unix-подобных системах биты передаются через ваш umaskпараметр, который обычно должен был 022бы удалить разрешение на запись из «группы» и «другого» или 002удалить разрешение на запись только из «другого». Это также может быть, 077если вы особенно обеспокоены конфиденциальностью и хотите удалить разрешения на чтение, запись и выполнение как из «группы», так и из «другого».
1 Чрезвычайно ранние версии Git сохранили групповые разрешения, поэтому в некоторых репозиториях есть записи дерева с режимом 664. Современный Git этого не делает, но, поскольку никакая часть какого-либо объекта не может быть изменена, эти старые биты прав доступа все еще сохраняются в старых объектах дерева.
Изменение для хранения только 0644 или 0755 было в коммите e44794706eeb57f2 , который был до Git v0.99 и датирован 16 апреля 2005 года.
e44794706eeb57f2ee38ed1604821aa38b8ad9d2, т. е. до Git версии 0.99.