Відповіді:
Згідно з офіційною документацією , ви можете встановити або видалити "виконуваний" прапор з будь-якого відстежуваного файлу за допомогою 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
Відповідь Антвена правильна, і це має бути коментар, але коментарі не мають достатньо місця та не дозволяють форматувати. :-) Я просто хочу додати, що в 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.