Wie erstelle ich Berechtigungen für den Ausführungsmodus von Dateien in Git unter Windows?

378

Ich verwende Git in Windows und möchte das ausführbare Shell-Skript mit einem Commit in Git Repo verschieben.

Normalerweise muss ich zwei Schritte ausführen ( 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

Wie kann ich diese beiden Schritte zu einem Schritt kombinieren? Git-Konfiguration? Windows-Befehl?

Erinnern Sie : Zwei Antworten sind gut, git add --chmod=+x filewird in der neuen Git-Version unterstützt

Referenz: Siehe Frage in Git-Dateiberechtigungen unter Windows für das zweite Festschreiben

Larry Cai
quelle
10
Mit git 2.9.x / 2.10 (Q3 2016) git add --chmod=+xist das tatsächlich möglich. Siehe meine Antwort unten , Dank an Edward Thomson .
VonC
5
Es würde sich lohnen, die ausgewählte Antwort auf die git add --chmod=+xVersion zu aktualisieren
mikemaccana

Antworten:

590

Es ist nicht erforderlich, dies in zwei Commits zu tun. Sie können die Datei hinzufügen und sie in einem einzigen 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 bemerken, ist der Modus nach dem Hinzufügen 0644 (dh nicht ausführbar). Wir können es jedoch vor dem Festschreiben als ausführbar markieren:

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

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

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

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

Und jetzt haben wir ein einziges Commit mit einer einzigen ausführbaren Datei.

Edward Thomson
quelle
147

In der Tat wäre es schön, wenn git-addeine --modeFlagge wäre

git 2.9.x / 2.10 (Q3 2016) wird dies tatsächlich zulassen (danke an Edward Thomson ):

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

Das beschleunigt den gesamten Prozess und funktioniert auch dann, wenn core.filemodefalse festgelegt ist.

Siehe Commit 4e55ed3 (31. Mai 2016) von Edward Thomson ( ethomson) .
Mit freundlicher Unterstützung von Johannes Schindelin ( dscho) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit c8b080a , 06. Juli 2016)

add: add --chmod=+x/ --chmod=-xoptions

Das ausführbare Bit wird für Pfade in einem Repository mit dem core.filemodeWert false nicht erkannt (und daher auch nicht festgelegt) , obwohl die Benutzer möglicherweise weiterhin Dateien als ausführbar hinzufügen möchten, um die Kompatibilität mit anderen Benutzern zu gewährleisten, die über core.filemode Funktionen verfügen .
Beispielsweise möchten Windows-Benutzer, die Shell-Skripte hinzufügen, diese möglicherweise als ausführbare Datei hinzufügen, um die Kompatibilität mit Benutzern unter Nicht-Windows zu gewährleisten.

Obwohl dies mit einem Plumbing-Befehl ( git update-index --add --chmod=+x foo) möglich ist, können Benutzer beim Einlernen des git-addBefehls eine ausführbare Datei mit einem Befehl festlegen, mit dem sie bereits vertraut sind .

VonC
quelle
22

Wenn für die Dateien bereits das Flag + x gesetzt ist, git update-index --chmod=+xwird nichts ausgeführt und git glaubt, dass nichts festgeschrieben werden muss, obwohl das Flag nicht im Repo gespeichert wird.

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

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

dann sieht git eine Änderung und ermöglicht es Ihnen, die Änderung zu übernehmen.

Böhmisch
quelle
9

Der Hinweis lautet zunächst, dass Sie sicher sein müssen, dass filemodeer falsein der Konfigurations-Git-Datei festgelegt ist, oder verwenden Sie diesen Befehl:

git config core.filemode false

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

git update-index --chmod=+x foo.sh
Nabi KAZ
quelle
3

Ich habe kein touchund chmodBefehl in meiner cmd.exe und git update-index --chmod=+x foo.shfunktioniert nicht für mich.

Ich löse es schließlich durch Setzen von skip-worktreeBit:

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