Як додати дозволи 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.