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?
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:
Secondo la documentazione ufficiale , è possibile impostare o rimuovere il flag "eseguibile" su qualsiasi file tracciato utilizzando il update-index
comando 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 regolari100755
per quelli eseguibiliPuoi visualizzarlo usando il ls-file
sottocomando, con l' --stage
opzione:
$ 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.fileMode
opzione 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
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 644
o 755
(scritto ( 100644
e 100755
; la 100
parte 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 umask
impostazioni, che normalmente dovrebbero 022
rimuovere l'autorizzazione di scrittura da "gruppo" e "altro" o 002
rimuovere l'autorizzazione di scrittura solo da "altro". Potrebbe anche essere 077
se 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à 664
in 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.
e44794706eeb57f2ee38ed1604821aa38b8ad9d2
, ovvero precedenti alla versione 0.99 di Git.