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?

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

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.


„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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.