Jak dodać uprawnienia chmod do pliku w GIT?

182

Chcę zatwierdzić plik .sh, ale chcę, aby był wykonywalny, gdy pobieram ten sam plik na innym serwerze.

Czy można to zrobić bez ręcznego chmod u + x tego pliku na serwerach, które pobierają plik?

Henley Chiu
źródło

Odpowiedzi:

291

Zgodnie z oficjalną dokumentacją , możesz ustawić lub usunąć flagę "wykonywalny" dla dowolnego śledzonego pliku za pomocą update-indexpolecenia podrzędnego.

Aby ustawić flagę, użyj następującego polecenia:

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

Aby go usunąć, użyj:

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

Pod maską

Chociaż wygląda to jak zwykły system uprawnień do plików w systemie UNIX, w rzeczywistości tak nie jest. Git utrzymuje specjalny „tryb” dla każdego pliku w swojej pamięci wewnętrznej:

  • 100644 dla zwykłych plików
  • 100755 dla plików wykonywalnych

Możesz to wizualizować za pomocą ls-filepodkomendy, z --stageopcją:

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

Domyślnie, kiedy dodajesz plik do repozytorium, Git spróbuje uszanować jego atrybuty systemu plików i odpowiednio ustawi poprawny plik. Możesz to wyłączyć, ustawiając core.fileModeopcję na false:

git config core.fileMode false

Rozwiązywanie problemów

Jeśli w którymś momencie tryb pliku Git nie zostanie ustawiony, ale plik ma poprawną flagę systemu plików, spróbuj usunąć tryb i ustaw go ponownie:

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

Premia

Począwszy od Git 2.9, możesz ustawić plik na scenę ORAZ ustawić flagę jednym poleceniem:

git add --chmod=+x path/to/file
Antwane
źródło
Kiedy robię to, aby test.sh, git commit i push oraz checkout na innym serwerze, są to uprawnienia tego pliku: -rw-rw-r-- 1 użytkownik 12 grudnia 5 11:42 test.sh
Henley Chiu
Właśnie wykonałem test na jednym z moich repozytoriów i działa zgodnie z oczekiwaniami. Uprawnienia zostały ustawione dla pliku za pomocą podanego polecenia w systemie Windows. Na jednym z moich serwerów (Debian) plik miał wcześniej uprawnienia -rw-r - r--, teraz ustawiono je na -rwxr-xr-x. Jakiej wersji git używasz na komputerach lokalnych i zdalnych?
Antwane,
git w wersji 1.9.5 na moim lokalnym i git 1.7.1 na serwerze wykonującym checkout.
Henley Chiu,
Właśnie próbowałem sklonować na innym (starszym) serwerze z git 1.7.10, nadal działa dobrze, plik ma uprawnienia x. Może w którymś momencie popełniłeś błąd lub masz problemy z uprawnieniami użytkownika, który sklonował na serwerze zdalnym
Antwane
Pamiętaj, że możesz tylko zmienić (ustawić lub wyczyścić) uprawnienia do wykonywania. Git nie śledzi żadnych innych uprawnień (takich jak uprawnienia do odczytu lub zapisu).
Dan Anderson
25

Odpowiedź Antwane jest poprawna i powinien to być komentarz, ale w komentarzach jest za mało miejsca i nie pozwalają na formatowanie. :-) Chcę tylko dodać, że w Git, prawa dostępu do plików są zapisywane tylko 1 jako albo 644albo 755(pisane ( 100644i 100755; 100część oznacza "zwykły plik"):

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

Pierwsza - 644 - oznacza, że ​​plik nie powinien być wykonywalny, a druga oznacza, że powinien być wykonywalny. Sposób, w jaki zmienia się to w rzeczywiste tryby plików w systemie plików, zależy w pewnym stopniu od systemu operacyjnego. W systemach uniksowych bity przechodzą przez twoje umaskustawienie, które normalnie polega 022na odebraniu uprawnień do zapisu „grupie” i „innym” lub 002odebraniu uprawnień do zapisu tylko „innym”. Może się tak zdarzyć, 077jeśli szczególnie martwisz się o prywatność i chcesz usunąć uprawnienia do odczytu, zapisu i wykonywania zarówno dla „grupy”, jak i „innych”.


1 Bardzo wczesne wersje Gita zapisywały uprawnienia grup, więc niektóre repozytoria mają wpisy w drzewie z trybem 664. Współczesny Git tego nie robi, ale ponieważ żadna część żadnego obiektu nie może być nigdy zmieniona, te stare bity uprawnień nadal pozostają w starych obiektach drzew.

Zmiana polegająca na przechowywaniu tylko 0644 lub 0755 została wprowadzona w zatwierdzeniu e44794706eeb57f2 , który jest przed wersją Git v0.99 i datowany na 16 kwietnia 2005 r.

torek
źródło
„Wczesne wersje Gita” masz jakiś pomysł, których dokładnych wersji dotyczy to?
user5359531
2
@ user5359531 wersje przed zatwierdzeniem e44794706eeb57f2ee38ed1604821aa38b8ad9d2, tj. przed wersją Git 0.99.
torek