Como criar permissões de modo de execução de arquivo no Git no Windows?

378

Eu uso o Git no Windows e quero inserir o script de shell executável no repositório do git por uma confirmação.

Normalmente eu preciso fazer dois passos ( 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

Como posso combinar esses dois passos em um passo? configuração git? comando do windows?

Lembrar : duas respostas são boas, git add --chmod=+x filesão suportadas na nova versão git

Referência: veja a pergunta em permissões de arquivo Git no Windows para segunda confirmação

Larry Cai
fonte
10
Com o git 2.9.x / 2.10 (terceiro trimestre de 2016), git add --chmod=+xé realmente possível. Veja minha resposta abaixo , crédito para Edward Thomson .
VonC 9/07
5
Seria pena atualizar a resposta selecionada para a git add --chmod=+xversão
mikemaccana

Respostas:

590

Não é necessário fazer isso em duas confirmações; você pode adicionar o arquivo e marcá-lo como executável em uma única confirmação:

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

Como você observa, após adicionar, o modo é 0644 (ou seja, não executável). No entanto, podemos marcá-lo como executável antes de confirmar:

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

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

E agora o arquivo está no modo 0755 (executável).

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

E agora temos um único commit com um único arquivo executável.

Edward Thomson
fonte
147

De fato, seria bom se git-addtivesse uma --modebandeira

O git 2.9.x / 2.10 (terceiro trimestre de 2016) na verdade permitirá isso (graças a Edward Thomson ):

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

Isso torna todo o processo mais rápido e funciona mesmo se core.filemodefor definido como falso.

Veja commit 4e55ed3 (31 de maio de 2016) por Edward Thomson ( ethomson) .
Ajudado por: Johannes Schindelin ( dscho) .
(Mesclado por Junio ​​C Hamano - gitster- na confirmação c8b080a , 06 de julho de 2016)

add: adicionar --chmod=+x/ --chmod=-xopções

O bit executável não será detectado (e, portanto, não será definido) para caminhos em um repositório com core.filemodeconjunto para false, embora os usuários ainda podem querer adicionar arquivos como executável para compatibilidade com outros usuários que fazem têm core.filemode funcionalidade.
Por exemplo, os usuários do Windows que adicionam scripts de shell podem querer adicioná-los como executáveis ​​para compatibilidade com usuários que não são do Windows.

Embora isso possa ser feito com um comando de canalização ( git update-index --add --chmod=+x foo), ensinar o git-addcomando permite que os usuários definam um arquivo executável com um comando que eles já estão familiarizados .

VonC
fonte
22

Se os arquivos tiverem o sinalizador + x definido, git update-index --chmod=+xnão fará nada e o git achará que não há nada a confirmar, mesmo que o sinalizador não esteja sendo salvo no repositório.

Você deve primeiro remover a flag, executar o comando git e depois colocar a flag de volta:

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

então o git vê uma mudança e permitirá que você efetue a alteração.

Boêmio
fonte
9

A nota é primeiramente que você deve ter certeza de que está filemodedefinido falseno arquivo config git, ou use este comando:

git config core.filemode false

e, em seguida, você pode definir a permissão 0777 com este comando:

git update-index --chmod=+x foo.sh
Nabi KAZ
fonte
3

Não tenho touche chmodcomando no meu cmd.exe e git update-index --chmod=+x foo.shnão funciona para mim.

Finalmente resolvo definindo skip-worktreebit:

git update-index --skip-worktree --chmod=+x foo.sh
khiav reoy
fonte