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?
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:
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ów100755 dla plików wykonywalnychMoż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
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.
e44794706eeb57f2ee38ed1604821aa38b8ad9d2, tj. przed wersją Git 0.99.