Come creare i permessi della modalità di esecuzione dei file in Git su Windows?


378

Uso Git in Windows e voglio inserire lo script della shell eseguibile nel repository git con un commit.

Di solito ho bisogno di fare due passaggi ( 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

Come posso combinare questi due passaggi in un solo passaggio? configurazione git? comando windows?

Ricorda : due risposte sono buone, git add --chmod=+x fileè supportato nella nuova versione di git

Riferimento: vedere la domanda in Autorizzazioni file Git su Windows per il secondo commit


10
Con git 2.9.x / 2.10 (3 ° trimestre 2016), git add --chmod=+xè effettivamente possibile. Vedi la mia risposta di seguito , merito a Edward Thomson .
VonC,

5
Vale la pena aggiornare la risposta selezionata alla git add --chmod=+xversione
mikemaccana,

Risposte:


591

Non è necessario eseguire questa operazione in due commit, è possibile aggiungere il file e contrassegnarlo come eseguibile in un unico commit:

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

Come si nota, dopo l'aggiunta, la modalità è 0644 (ovvero non eseguibile). Tuttavia, possiamo contrassegnarlo come eseguibile prima di eseguire il commit:

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

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

E ora il file è in modalità 0755 (eseguibile).

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 ora abbiamo un unico commit con un singolo file eseguibile.


147

Anzi, sarebbe bello se git-addavesse una --modebandiera

git 2.9.x / 2.10 (3 ° trimestre 2016) lo consentirà effettivamente (grazie a Edward Thomson ):

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

Ciò rende tutto il processo più veloce e funziona anche se core.filemodeimpostato su false.

Vedi commit 4e55ed3 (31 maggio 2016) di Edward Thomson ( ethomson) .
Aiutato da: Johannes Schindelin ( dscho) .
(Unito da Junio ​​C Hamano - gitster- in commit c8b080a , 06 lug 2016)

add: aggiungi --chmod=+x/ --chmod=-xopzioni

Il bit eseguibile non verrà rilevato (e quindi non sarà set) per le piste in un repository con core.filemodeimpostato su false, anche se gli utenti possono comunque desiderare di aggiungere file come eseguibile per la compatibilità con gli altri utenti che fare avere core.filemode funzionalità.
Ad esempio, gli utenti Windows che aggiungono script di shell potrebbero volerli aggiungere come eseguibili per la compatibilità con utenti non Windows.

Sebbene ciò possa essere fatto con un comando idraulico ( git update-index --add --chmod=+x foo), l' insegnamento del git-addcomando consente agli utenti di impostare un file eseguibile con un comando che hanno già familiarità .


22

Se i file hanno già il flag + x impostato,git update-index --chmod=+x non fa nulla e git pensa che non ci sia nulla da impegnare, anche se il flag non viene salvato nel repository.

Devi prima rimuovere il flag, eseguire il comando git, quindi reinserire il flag:

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

quindi git vede una modifica e ti consentirà di confermare la modifica.


10

La nota è innanzitutto che devi essere filemodeimpostato su falsenel file config git o utilizzare questo comando:

git config core.filemode false

e quindi puoi impostare l'autorizzazione 0777 con questo comando:

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

3

Non ho touche chmodcomando nel mio cmd.exe e git update-index --chmod=+x foo.shnon funziona per me.

Finalmente lo risolvo impostando skip-worktreebit:

git update-index --skip-worktree --chmod=+x foo.sh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.