Come aggiungere le autorizzazioni chmod al file in GIT?


182

Voglio eseguire il commit di un file .sh, ma voglio che sia eseguibile quando eseguo il checkout dello stesso file in un altro server.

C'è un modo per farlo senza manualmente chmod u + x quel file nei server che effettuano il checkout del file?

Risposte:


291

Secondo la documentazione ufficiale , è possibile impostare o rimuovere il flag "eseguibile" su qualsiasi file tracciato utilizzando il update-indexcomando secondario.

Per impostare il flag, utilizzare il comando seguente:

git update-index --chmod=+x path/to/file

Per rimuoverlo, utilizzare:

git update-index --chmod=-x path/to/file

Sotto il cappuccio

Mentre questo sembra il normale sistema di autorizzazione dei file unix, in realtà non lo è. Git mantiene una "modalità" speciale per ciascun file nella sua memoria interna:

  • 100644 per file regolari
  • 100755 per quelli eseguibili

Puoi visualizzarlo usando il ls-filesottocomando, con l' --stageopzione:

$ git ls-files --stage
100644 aee89ef43dc3b0ec6a7c6228f742377692b50484 0       .gitignore
100755 0ac339497485f7cc80d988561807906b2fd56172 0       my_executable_script.sh

Per impostazione predefinita, quando aggiungi un file a un repository, Git cercherà di onorare gli attributi del suo filesystem e impostare la modalità file corretta di conseguenza. Puoi disabilitarlo impostando l' core.fileModeopzione su false:

git config core.fileMode false

Risoluzione dei problemi

Se a un certo punto la modalità file Git non è impostata ma il file ha il flag del filesystem corretto, prova a rimuovere la modalità e a impostarla di nuovo:

git update-index --chmod=-x path/to/file
git update-index --chmod=+x path/to/file

indennità

A partire da Git 2.9, puoi mettere in scena un file E impostare il flag in un solo comando:

git add --chmod=+x path/to/file

Quando lo faccio per test.sh, git commit e push e checkout in un altro server, questi sono i permessi di quel file: -rw-rw-r-- 1 utente utente 12 dic 5 11:42 test.sh
Henley Chiu,

Ho appena eseguito il test su uno dei miei repository e funziona come previsto. Le autorizzazioni sono state impostate sul file utilizzando il comando fornito in Windows. Su uno dei miei server (Debian) il file aveva prima le autorizzazioni -rw-r - r--, ora impostato su -rwxr-xr-x. Quale versione git usi su macchine locali e remote?
Antwane,

git versione 1.9.5 nel mio locale e git 1.7.1 nel server facendo il checkout.
Henley Chiu,

Ho appena provato a clonare su un altro (vecchio) server con git 1.7.10, funziona ancora bene, il file ha permessi x. Forse hai fatto un errore ad un certo punto o hai problemi di autorizzazione con l'utente che ha clonato sul server remoto
Antwane,

Si noti che è possibile modificare (impostare o cancellare) solo le autorizzazioni di esecuzione. Git non tiene traccia di altre autorizzazioni (come le autorizzazioni di lettura o scrittura).
Dan Anderson,

25

La risposta di Antwane è corretta e questo dovrebbe essere un commento ma i commenti non hanno abbastanza spazio e non consentono la formattazione. :-) Voglio solo aggiungere che in Git, i permessi sui file sono registrati solo 1 come uno 644o 755(scritto ( 100644e 100755; la 100parte significa "file normale"):

diff --git a/path b/path
new file mode 100644

Il primo — 644 — significa che il file non dovrebbe essere eseguibile e il secondo significa che dovrebbe essere eseguibile. Il modo in cui ciò si trasforma in modalità file effettive all'interno del file system dipende in qualche modo dal sistema operativo. Su sistemi simili a Unix, i bit vengono passati attraverso le umaskimpostazioni, che normalmente dovrebbero 022rimuovere l'autorizzazione di scrittura da "gruppo" e "altro" o 002rimuovere l'autorizzazione di scrittura solo da "altro". Potrebbe anche essere 077se sei particolarmente preoccupato per la privacy e desideri rimuovere l'autorizzazione di lettura, scrittura ed esecuzione sia da "gruppo" che da "altro".


1 Le versioni estremamente precoci di Git hanno salvato le autorizzazioni di gruppo, in modo che alcuni repository abbiano voci ad albero con modalità 664in esse. Modern Git no, ma poiché nessuna parte di alcun oggetto può mai essere cambiata, quei vecchi bit di permessi persistono ancora nei vecchi oggetti ad albero.

La modifica per memorizzare solo 0644 o 0755 era in commit e44794706eeb57f2 , precedente a Git v0.99 e datata 16 aprile 2005.


"Prime versioni di Git" hai idea di quali versioni esatte ne siano influenzate?
user5359531

2
@ user5359531 versioni precedenti al commit e44794706eeb57f2ee38ed1604821aa38b8ad9d2, ovvero precedenti alla versione 0.99 di Git.
Torek
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.