Wie füge ich chmod-Berechtigungen zur Datei in GIT hinzu?

182

Ich möchte eine .sh-Datei festschreiben, möchte aber, dass sie ausführbar ist, wenn ich dieselbe Datei auf einem anderen Server auschecke.

Gibt es eine Möglichkeit, dies zu tun, ohne diese Datei auf den Servern, die die Datei auschecken, manuell zu ändern?

Henley Chiu
quelle

Antworten:

290

Gemäß der offiziellen Dokumentation können Sie das Flag "ausführbar" für jede verfolgte Datei mit dem update-indexUnterbefehl setzen oder entfernen .

Verwenden Sie den folgenden Befehl, um das Flag zu setzen:

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

Verwenden Sie zum Entfernen:

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

Unter der Haube

Dies sieht zwar aus wie das reguläre Unix-Dateiberechtigungssystem, ist es aber nicht. Git unterhält für jede Datei in seinem internen Speicher einen speziellen "Modus":

  • 100644 für reguläre Dateien
  • 100755 für ausführbare

Sie können es mit dem ls-fileUnterbefehl visualisieren , mit der --stageOption:

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

Wenn Sie eine Datei zu einem Repository hinzufügen, versucht Git standardmäßig, die Dateisystemattribute zu berücksichtigen und den richtigen Dateimodus entsprechend festzulegen. Sie können dies deaktivieren, indem Sie die core.fileModeOption auf false setzen:

git config core.fileMode false

Fehlerbehebung

Wenn der Git-Dateimodus irgendwann nicht mehr festgelegt ist, die Datei jedoch das richtige Dateisystem-Flag aufweist, versuchen Sie, den Modus zu entfernen und erneut festzulegen:

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

Bonus

Ab Git 2.9 können Sie eine Datei bereitstellen UND das Flag in einem Befehl setzen:

git add --chmod=+x path/to/file
Antwane
quelle
Wenn ich das mache, um test.sh zu testen, git festzuschreiben und zu pushen und auf einem anderen Server auszuchecken, sind dies die Dauerwellen dieser Datei: -rw-rw-r-- 1 Benutzer Benutzer 12 Dec 5 11:42 test.sh
Henley Chiu
Ich habe den Test gerade in einem meiner Repositorys durchgeführt und er funktioniert wie erwartet. Die Berechtigungen für die Datei wurden mit dem unter Windows angegebenen Befehl festgelegt. Auf einem meiner Server (Debian) hatte die Datei zuvor die Berechtigungen -rw-r - r--, die jetzt auf -rwxr-xr-x gesetzt sind. Welche Git-Version verwenden Sie auf lokalen und Remote-Computern?
Antwane
Git Version 1.9.5 in meinem lokalen und Git 1.7.1 auf dem Server, der die Kasse durchführt.
Henley Chiu
Ich habe gerade versucht, mit git 1.7.10 auf einen anderen (älteren) Server zu klonen. Es funktioniert immer noch gut. Die Datei verfügt über x Berechtigungen. Vielleicht haben Sie irgendwann einen Fehler gemacht, oder Sie haben Berechtigungsprobleme mit dem Benutzer, der auf dem Remote-Server geklont hat
Antwane
Beachten Sie, dass Sie nur die Ausführungsberechtigung ändern (setzen oder löschen) können. Git verfolgt keine anderen Berechtigungen (wie Lese- oder Schreibberechtigungen).
Dan Anderson
25

Antwanes Antwort ist richtig, und dies sollte ein Kommentar sein, aber Kommentare haben nicht genügend Speicherplatz und erlauben keine Formatierung. :-) Ich möchte nur hinzufügen, dass in Git Dateiberechtigungen nur 1 als entweder 644oder 755(geschrieben ( 100644und 100755; der 100Teil bedeutet "normale Datei") aufgezeichnet werden :

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

Die ehemaligen-644-Mittel , die die Datei sollte nicht ausführbar sein, und Letzteres bedeutet , dass es sollte ausführbar sein. Wie dies zu tatsächlichen Dateimodi in Ihrem Dateisystem wird, hängt etwas vom Betriebssystem ab. Auf Unix-ähnlichen Systemen werden die Bits durch Ihre umaskEinstellung geleitet. Dies besteht normalerweise darin 022, die Schreibberechtigung von "Gruppe" und "Andere" 002zu entfernen oder die Schreibberechtigung nur von "Andere" zu entfernen. Dies kann auch der Fall sein, 077wenn Sie sich besonders um den Datenschutz sorgen und die Lese-, Schreib- und Ausführungsberechtigung sowohl von "group" als auch von "other" entfernen möchten.


1 Extrem frühe Versionen von Git haben Gruppenberechtigungen gespeichert, sodass einige Repositorys Baumeinträge mit Modus enthalten 664. Modernes Git nicht, aber da kein Teil eines Objekts jemals geändert werden kann, bleiben diese alten Berechtigungsbits in alten Baumobjekten bestehen.

Die Änderung, nur 0644 oder 0755 zu speichern, erfolgte in Commit e44794706eeb57f2 , das vor Git v0.99 und vom 16. April 2005 liegt.

torek
quelle
"Frühe Versionen von Git" Irgendeine Idee, welche genauen Versionen davon betroffen sind?
user5359531
2
@ user5359531 Versionen vor dem Festschreiben e44794706eeb57f2ee38ed1604821aa38b8ad9d2, dh vor Git Version 0.99.
Torek