Как добавить права доступа 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, который установлен по умолчанию на локальном компьютере!

Другие вопросы по тегам