Как добавить права доступа chmod к файлу в GIT?
Я хочу сделать коммит в файле.sh, но хочу, чтобы он был исполняемым, когда я извлекаю тот же файл на другом сервере.
Есть ли способ сделать это без ручного chmod u+x этот файл на серверах, которые извлекают файл?
4 ответа
Согласно официальной документации, вы можете установить или убрать флаг "исполняемый" в любом отслеживаемом файле, используя 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
вариант к ложному:
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
part означает "обычный файл"):
diff --git a/path b/path
new file mode 100644
Первый - 644 - означает, что файл не должен быть исполняемым, а второй означает, что он должен быть исполняемым. То, как это превращается в реальные файловые режимы в вашей файловой системе, зависит от ОС. В Unix-подобных системах биты передаются через ваш umask
настройка, которая обычно 022
удалить разрешение на запись из "группы" и "других", или 002
удалить разрешение на запись только из "другого". Это также может быть 077
если вас особенно беспокоит конфиденциальность и вы хотите удалить разрешения на чтение, запись и выполнение как для "группы", так и для "других".
1 Ранние версии Git сохранили групповые разрешения, так что некоторые репозитории имеют записи в дереве с режимом 664
в них. Современный Git этого не делает, но, поскольку никакая часть какого-либо объекта не может быть изменена, эти старые биты прав доступа сохраняются в старых объектах дерева.
Чтобы установить флаг выполнения для всех файлов в репозитории:
git ls-files --stage |grep 100644 | cut -f2 | xargs git update-index --chmod=+x
Чтобы снять флаг выполнения для всех файлов, сделайте обратное
git ls-files --stage | grep 100755 | cut -f2 | xargs git update-index --chmod=-x
... и установить все
.sh
-scripts исполняемый файл, может это ваш путь:
git ls-files --stage | grep ".sh$" | cut -f2 | xargs git update-index --chmod=+x
Не забудь
set sudo chmod +x /path/to/file
локально, помимо обновления git, иначе git всегда будет возвращать индекс к 644, который установлен по умолчанию на локальном компьютере!