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?
Zgodnie z oficjalną dokumentacją , możesz ustawić lub usunąć flagę "wykonywalny" dla dowolnego śledzonego pliku za pomocą update-index
polecenia 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-file
podkomendy, z --stage
opcją:
$ 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.fileMode
opcję 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
644
albo755
(pisane (100644
i100755
;100
część oznacza "zwykły plik"):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
umask
ustawienie, które normalnie polega022
na odebraniu uprawnień do zapisu „grupie” i „innym” lub002
odebraniu uprawnień do zapisu tylko „innym”. Może się tak zdarzyć,077
jeś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.
źródło
e44794706eeb57f2ee38ed1604821aa38b8ad9d2
, tj. przed wersją Git 0.99.