Як додати дозволи chmod до файлу в GIT?


182

Я хочу git зробити файл .sh, але хочу, щоб він виконувався, коли перевіряю цей самий файл на іншому сервері.

Чи можна це зробити без chmod u + x цього файлу на серверах, які перевіряють файл?

Відповіді:


291

Згідно з офіційною документацією , ви можете встановити або видалити "виконуваний" прапор з будь-якого відстежуваного файлу за допомогою 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 фіксації та натискання та оформлення замовлення на іншому сервері, це перміси цього файлу: -rw-rw-r-- 1 користувач користувача 12 грудня 5 11:42 test.sh
— Henley Chiu

Я щойно провів тест на одному зі своїх сховищ, і він працює як слід. Дозволи були встановлені у файлі за допомогою наданої команди під Windows. На одному з мого сервера (Debian) у файлі раніше були дозволи -rw-r - r--, тепер встановлено на -rwxr-xr-x. Яку версію git ви використовуєте на локальних та віддалених машинах?
— Антван

git версії 1.9.5 в моїй локальній, а git 1.7.1 на сервері, що робить замовлення.
— Henley Chiu

Щойно спробував клонувати на іншому (старшому) сервері з git 1.7.10, він все ще працює добре, файл має x права доступу. Можливо, ви помилилися в якийсь момент, або у вас є проблеми з дозволом з користувачем, який клонував на віддаленому сервері
— Antwane

Зверніть увагу, що ви можете змінити (встановити чи очистити) дозвіл на виконання. Git не відстежує жодного іншого дозволу (наприклад, дозволу на читання чи запис).
— Ден Андерсон

25

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


"Ранні версії Git" будь-яка ідея, які саме версії впливають на це?
— користувач5359531

2
@ user5359531 версії перед фіксацією e44794706eeb57f2ee38ed1604821aa38b8ad9d2, тобто передбачуваною версією Git 0.99.
— Торека
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.