Как создать права доступа к файлу в 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

Как я могу объединить эти два шага в один шаг? Конфигурация мерзавца? команда windows?

Напомним : два ответа хороши, git add --chmod=+x fileподдерживается в новой версии git

Ссылка: см. Вопрос в разделе Разрешения файла Git в Windows для второго коммита

Ларри Кай
источник
10
С git 2.9.x / 2.10 (3 квартал 2016 г.) git add --chmod=+xэто действительно возможно. Смотрите мой ответ ниже , спасибо Эдварду Томсону .
VonC
5
Стоило бы обновить выбранный ответ до git add --chmod=+xверсии
mikemaccana

Ответы:

593

Нет необходимости делать это в двух коммитах, вы можете добавить файл и пометить его как исполняемый:

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

И теперь у нас есть один коммит с одним исполняемым файлом.

Эдвард Томсон
источник
148

Действительно, было бы неплохо, если git-addбы был --modeфлаг

git 2.9.x / 2.10 (3 квартал 2016 года) на самом деле позволит это (благодаря Эдварду Томсону ):

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

Это ускоряет весь процесс и работает, даже если core.filemodeустановлено значение false.

Смотрите коммит 4e55ed3 (31 мая 2016 г.) Эдварда Томсона ( ethomson) .
Помогает: Йоханнес Шинделин ( dscho) .
(Объединено Junio ​​C Hamano - gitster- в коммите c8b080a , 06 июля 2016 г.)

add: добавить --chmod=+x/--chmod=-x опции

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

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

VonC
источник
22

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

Сначала вы должны удалить флаг, запустить команду git, а затем вернуть флаг:

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

тогда git увидит изменение и позволит вам зафиксировать изменение.

Богемский
источник
10

Примечание: во-первых, вы должны убедиться, что filemodeустановлено falseв config git file, или использовать эту команду:

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
Хиав Реой
источник