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