Jak utworzyć uprawnienia trybu wykonywania pliku w Git w systemie Windows?

377

Używam Git w systemie Windows i chcę wypchnąć wykonywalny skrypt powłoki do git repo za pomocą jednego zatwierdzenia.

Zwykle muszę zrobić dwa kroki ( 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

Jak połączyć te dwa kroki w jeden krok? konfiguracja git? polecenie Windows?

Przypomnij : Dwie odpowiedzi są dobre, git add --chmod=+x filejest obsługiwane w nowej wersji git

Odniesienie: patrz pytanie w uprawnieniach do plików Git w systemie Windows dla drugiego zatwierdzenia

Larry Cai
źródło
10
Z git 2.9.x / 2.10 (III kwartał 2016) git add --chmod=+xjest w rzeczywistości możliwe. Zobacz moją odpowiedź poniżej , podziękowania dla Edwarda Thomsona .
VonC,
5
Warto zaktualizować wybraną odpowiedź do git add --chmod=+xwersji
mikemaccana,

Odpowiedzi:

589

Nie trzeba tego robić w dwóch zatwierdzeniach, możesz dodać plik i oznaczyć go jako wykonywalny w jednym zatwierdzeniu:

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

Jak zauważasz, po dodaniu tryb ma wartość 0644 (tzn. Nie jest wykonywalny). Możemy jednak oznaczyć go jako wykonywalny przed zatwierdzeniem:

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

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

A teraz plik ma tryb 0755 (wykonywalny).

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

A teraz mamy jedno zatwierdzenie z jednym plikiem wykonywalnym.

Edward Thomson
źródło
147

Rzeczywiście byłoby miło, gdyby git-addmiał --modeflagę

git 2.9.x / 2.10 (III kwartał 2016) faktycznie pozwoli na to (dzięki Edwardowi Thomsonowi ):

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

To sprawia, że ​​cały proces jest szybszy i działa, nawet jeśli core.filemodejest ustawiony na false.

Zobacz commit 4e55ed3 (31 maja 2016 r.), Autor: Edward Thomson ( ethomson) .
Pomocnik: Johannes Schindelin ( dscho) .
(Połączone przez Junio ​​C Hamano - gitster- w commit c8b080a , 06 lipca 2016)

add: dodaj --chmod=+x/ --chmod=-xopcje

Wykonywalny bit nie zostanie wykryty (a więc nie będzie set) dla ścieżek w repozytorium z core.filemodeustawiona na false, chociaż użytkownicy mogą nadal chcą, aby dodać pliki jako wykonywalny dla kompatybilności z innymi użytkownikami, którzy zrobienia mieć core.filemode funkcjonalność.
Na przykład użytkownicy systemu Windows dodający skrypty powłoki mogą chcieć dodać je jako pliki wykonywalne w celu zachowania zgodności z użytkownikami w systemach innych niż Windows.

Chociaż można tego dokonać za pomocą polecenia hydraulicznego ( git update-index --add --chmod=+x foo), nauczenie tego git-addpolecenia pozwala użytkownikom ustawić plik wykonywalny za pomocą polecenia, które już znają .

VonC
źródło
22

Jeśli pliki mają już ustawioną flagę + x, git update-index --chmod=+xnic nie robi i git uważa, że ​​nie ma nic do zatwierdzenia, nawet jeśli flaga nie jest zapisywana w repozytorium.

Musisz najpierw usunąć flagę, uruchomić polecenie git, a następnie odłożyć flagę z powrotem:

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

wtedy git widzi zmianę i pozwoli ci ją zatwierdzić.

Czeski
źródło
9

Uwaga: po pierwsze musisz się upewnić o filemodeustawieniu na falseplik config git lub użyj tego polecenia:

git config core.filemode false

a następnie możesz ustawić uprawnienie 0777 za pomocą tego polecenia:

git update-index --chmod=+x foo.sh
Nabi KAZ
źródło
3

Mam polecenie no touchi chmodpolecenie w moim cmd.exe i git update-index --chmod=+x foo.shnie działa dla mnie.

W końcu rozwiązuję to, ustawiając skip-worktreebit:

git update-index --skip-worktree --chmod=+x foo.sh
chiav reoy
źródło