Як створити дозволи на режим виконання файлів у Git в Windows?


378

Я використовую Git в Windows, і хочу перенести виконуваний скрипт оболонки в git repo одним комітом.

Зазвичай мені потрібно зробити два кроки ( git commit).

$ vi install.sh
$ git add install.sh  
$ git commit -am "add new file for installation" # first commit
[master f2e92da] add support for install.sh
 1 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 install.sh
$ git update-index --chmod=+x install.sh
$ git commit -am "update file permission"        # second commit
[master 317ba0c] update file permission
  0 files changed
  mode change 100644 => 100755 install.sh

Як я можу поєднати ці два кроки в один крок? конфігурація git? команда Windows?

Нагадаємо : дві відповіді хороші, git add --chmod=+x fileпідтримується в новій версії git

Довідка: див. Питання в дозволах файлів Git в Windows для другої фіксації


10
З git 2.9.x / 2.10 (Q3 2016), git add --chmod=+xце реально можливо. Дивіться мою відповідь нижче , заслуга Едварда Томсона .
VonC

5
Варто оновити вибрану відповідь до git add --chmod=+xверсії
mikemaccana

Відповіді:


590

Не потрібно робити це за два коміти, ви можете додати файл і позначити його виконуваним в одному комітеті:

C:\Temp\TestRepo>touch foo.sh

C:\Temp\TestRepo>git add foo.sh

C:\Temp\TestRepo>git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

Як зазначаєте, після додавання режим перебуває у 0644 (тобто не виконується). Однак ми можемо позначити його як виконуваний, перш ніж здійснити:

C:\Temp\TestRepo>git update-index --chmod=+x foo.sh

C:\Temp\TestRepo>git ls-files --stage
100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

А тепер файл знаходиться в режимі 0755 (виконується).

C:\Temp\TestRepo>git commit -m"Executable!"
[master (root-commit) 1f7a57a] Executable!
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100755 foo.sh

І тепер у нас є один комітет з одним виконуваним файлом.


147

Дійсно, було б добре, якби git-addбув --modeпрапор

git 2.9.x / 2.10 (Q3 2016) насправді дозволить (завдяки Едварду Томсону ):

git add --chmod=+x -- afile
git commit -m"Executable!"

Це робить весь процес швидшим і працює, навіть якщо core.filemodeвстановлено значення false.

Див. Комісію 4e55ed3 (31 травня 2016) Едварда Томсона ( ethomson) .
Допомагав: Йоганнес Шинделін ( dscho) .
(Об’єднано Хуніо С Хамано - gitster- у комітеті c8b080a , 06 липня 2016 р.)

add: додати --chmod=+x/ --chmod=-xпараметри

Біт, який виконується, не буде виявлений (і тому не буде встановлений) для шляхів у сховищі з core.filemodeвстановленим значенням false, хоча користувачі все ще можуть додати файли як виконувані для сумісності з іншими користувачами, які не мають core.filemode функціоналу.
Наприклад, користувачі Windows, що додають сценарії оболонки, можуть захотіти додати їх як виконувані для сумісності з користувачами в не-Windows.

Хоча це можна зробити за допомогою сантехнічної команди ( git update-index --add --chmod=+x foo), навчання git-addкоманди дозволяє користувачам встановити виконуваний файл із командою, з якою вони вже знайомі .


22

Якщо у файлах уже встановлено прапор + x, git update-index --chmod=+xнічого не робиться, і git вважає, що робити нічого, навіть якщо прапор не зберігається в репо.

Спочатку потрібно видалити прапор, виконати команду git, а потім поставити прапор назад:

chmod -x <file>
git update-index --chmod=+x <file>
chmod +x <file>

тоді git бачить зміну і дозволить вам здійснити зміни.


9

Банкнота в першу чергу ви повинні впевнена про filemodeнаборі для falseв конфігурації мерзотник файл, або використовуйте наступну команду:

git config core.filemode false

і тоді ви можете встановити дозвіл 0777 за допомогою цієї команди:

git update-index --chmod=+x foo.sh

3

Я не маю touchі chmodкоманди в моїй cmd.exe і git update-index --chmod=+x foo.shне працює для мене.

Я врешті вирішую це шляхом встановлення skip-worktreeбіта:

git update-index --skip-worktree --chmod=+x foo.sh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.