641 Stimmen

Wie erstellt man Dateiberechtigungen im Ausführungsmodus in Git unter Windows?

Ich benutze Git unter Windows und möchte das ausführbare Shell-Skript mit einem Commit in das Git-Repository schieben.

Normalerweise muss ich zwei Schritte machen (git commit).

$ vi install.sh
$ git add install.sh  
$ git commit -am "Neue Datei zur Installation hinzufügen" # erster Commit
[master f2e92da] Unterstützung für install.sh hinzufügen
 1 Datei geändert, 18 Zeilen eingefügt(+), 3 Zeilen gelöscht(-)
 create mode 100644 install.sh
$ git update-index --chmod=+x install.sh
$ git commit -am "Dateiberechtigungen aktualisieren"        # zweiter Commit
[master 317ba0c] Dateiberechtigungen aktualisieren
  0 Dateien geändert
  Modus ändern 100644 => 100755 install.sh

Wie kann ich diese beiden Schritte in einen Schritt kombinieren? Git-Konfiguration? Windows-Befehl?

Referenz: siehe Frage unter Git-Dateiberechtigungen unter Windows für den zweiten Commit

937voto

Edward Thomson Punkte 69902

Es ist nicht notwendig, dies in zwei Commits zu tun, Sie können die Datei hinzufügen und sie in einem einzelnen Commit als ausführbar markieren:

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

Wie Sie bereits bemerken, ist der Modus nach dem Hinzufügen 0644 (dh nicht ausführbar). Wir können sie jedoch als ausführbar markieren, bevor wir sie committen:

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

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

Und jetzt hat die Datei den Modus 0755 (ausführbar).

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

Und jetzt haben wir einen einzigen Commit mit einer einzelnen ausführbaren Datei.

302voto

VonC Punkte 1117238

Tatsächlich wäre es schön, wenn git-add eine --mode-Flagge hätte

git 2.9.x/2.10 (Q3 2016) wird das tatsächlich ermöglichen (danke an Edward Thomson):

git add --chmod=+x -- afile
git commit -m"Ausführbar!"

Dadurch wird der gesamte Prozess schneller und funktioniert auch, wenn core.filemode auf false gesetzt ist.

Siehe Commit 4e55ed3 (31. Mai 2016) von Edward Thomson (ethomson).
Mit Hilfe von: Johannes Schindelin (dscho).
(Merged by Junio C Hamano -- gitster -- in Commit c8b080a, 06. Jul 2016)

add: Optionen --chmod=+x / --chmod=-x hinzufügen

Das Ausführungsbit wird für Pfade in einem Repository mit core.filemode auf false nicht erkannt (und daher nicht gesetzt), obwohl Benutzer möglicherweise weiterhin Dateien als ausführbar hinzufügen möchten, um die Kompatibilität mit anderen Benutzern sicherzustellen, die doch die Funktionalität von core.filemode haben.
Zum Beispiel möchten Windows-Benutzer Shell-Skripte möglicherweise als ausführbar hinzufügen, um die Kompatibilität mit Benutzern außerhalb von Windows sicherzustellen.

Auch wenn dies mit einem Plumbing-Befehl gemacht werden kann (git update-index --add --chmod=+x foo), ermöglicht es den Benutzern, mit dem git-add-Befehl eine Datei als ausführbar festzulegen, mit einem Befehl, den sie bereits kennen.

78voto

Bohemian Punkte 386825

Wenn die Dateien bereits mit dem +x-Flag gesetzt sind, git update-index --chmod=+x nichts und git denkt, es gibt nichts zu übernehmen, obwohl das Flag nicht im Repository gespeichert wird.

Sie müssen zuerst das Flag entfernen, den git-Befehl ausführen und dann das Flag zurücksetzen:

chmod -x 
git update-index --chmod=+x 
chmod +x 

dann erkennt git eine Änderung und erlaubt es Ihnen, die Änderung zu übernehmen.


Erforderliche git-Konfiguration für den Kommitter (credit: Nabi’s Antwort):

git config core.filemode false

Erforderliche git-Konfiguration für den Cloner:

git config --global core.autocrlf input

28voto

khiav reoy Punkte 1253

Ich habe keinen touch und chmod Befehl in meinem cmd.exe und git update-index --chmod=+x foo.sh funktioniert nicht für mich.

Ich löse es schließlich, indem ich das skip-worktree Bit setze:

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

27voto

Nabi K.A.Z. Punkte 8144

Die Notiz ist zunächst sicherzustellen, dass filemode auf false im Konfigurations-Git-File gesetzt ist oder diesen Befehl verwenden:

git config core.filemode false

und dann können Sie die Berechtigung 0777 mit diesem Befehl setzen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X