Я хочу сделать коммит в файле .sh, но хочу, чтобы он был исполняемым, когда я извлекаю тот же файл на другом сервере.
Есть ли способ сделать это без ручного chmod u + x этот файл на серверах, которые извлекают файл?
Согласно официальной документации , вы можете установить или удалить флаг «исполняемый» для любого отслеживаемого файла с помощью 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
часть средств «обычный файл»):Первый - 644 - означает, что файл должен не быть исполняемым, а второй означает, что он должен быть исполняемым. То, как это превращается в реальные файловые режимы в вашей файловой системе, зависит от ОС. В Unix-подобных системах биты передаются через ваш
umask
параметр, который обычно должен был022
бы удалить разрешение на запись из «группы» и «другого» или002
удалить разрешение на запись только из «другого». Это также может быть,077
если вы особенно обеспокоены конфиденциальностью и хотите удалить разрешения на чтение, запись и выполнение как из «группы», так и из «другого».1 Чрезвычайно ранние версии Git сохранили групповые разрешения, поэтому в некоторых репозиториях есть записи дерева с режимом
664
. Современный Git этого не делает, но, поскольку никакая часть какого-либо объекта не может быть изменена, эти старые биты прав доступа все еще сохраняются в старых объектах дерева.Изменение для хранения только 0644 или 0755 было в коммите e44794706eeb57f2 , который был до Git v0.99 и датирован 16 апреля 2005 года.
источник
e44794706eeb57f2ee38ed1604821aa38b8ad9d2
, т. е. до Git версии 0.99.