Aktualizowanie i zatwierdzanie tylko uprawnień do pliku przy użyciu kontroli wersji git

187

Właśnie zmieniłem some.shplik w plik wykonywalny ( chmod 755 ...), uprawnienia zostały zaktualizowane, ale nie zawartość. Czy istnieje sposób, aby popełnić plik do git, tak, że wykonywalny nieco zostaną przywrócone / zestaw na klonie / utworu / ciągnąć ?

Aktualizacja: jak mogę śledzić, czy nowe uprawnienia zostały przesłane github?

BreakPhreak
źródło

Odpowiedzi:

190

Domyślnie git zaktualizuje uprawnienia do wykonywania plików, jeśli je zmienisz. Nie zmienia ani nie śledzi żadnych innych uprawnień.

Jeśli nie widzisz żadnych zmian podczas modyfikowania uprawnień do wykonywania, prawdopodobnie masz konfigurację w git, która ignoruje tryb pliku.

Zajrzyj do swojego projektu w .gitfolderze configpliku i powinieneś zobaczyć coś takiego:

[core]
    filemode = false

Możesz to zmienić truew swoim ulubionym edytorze tekstu lub uruchomić:

git config core.filemode true

Następnie powinieneś być w stanie normalnie zatwierdzić swoje pliki. Zatwierdzi tylko zmiany uprawnień.

Vincent B.
źródło
Dziękuję Ci! Jak mogę sprawdzić, czy zmiany uprawnień zostały przesłane github?
BreakPhreak
2
Możesz go zobaczyć podczas przeglądania pliku (na przykład w pliku gitignore w Railsach znajdziesz 100644 jako uprawnienie do pliku)
Vincent B.
8
Wprowadzanie zmian uprawnień w systemie Windows za pomocą git (faktycznie zmienianie uprawnień do plików i zatwierdzanie
fooMonster
39
Ta odpowiedź jest zła! Git śledzi tylko wtedy, gdy plik jest wykonywalny, czy nie. Nie śledzi innych uprawnień do plików, takich jak zapis lub odczyt. Przeczytaj stackoverflow.com/a/11231682/2311074, aby uzyskać więcej.
Adam
Dla mnie webstorm nie złapał zmiany, ale w git status, widzę zmiany ..
Townsheriff
193

Artykuł @fooMonster zadziałał dla mnie

# git ls-tree HEAD
100644 blob 55c0287d4ef21f15b97eb1f107451b88b479bffe    script.sh

Jak widać plik ma uprawnienia 644 (ignorowanie 100). Chcielibyśmy zmienić to na 755:

# git update-index --chmod=+x script.sh

zatwierdzić zmiany

# git commit -m "Changing file permissions"
[master 77b171e] Changing file permissions
0 files changed, 0 insertions(+), 0 deletions(-)
mode change 100644 => 100755 script.sh
ewwink
źródło
7
Należy zauważyć, że faktycznie musisz użyć „-x / + x”. Nie możesz ustawić żadnych innych uprawnień ani maski bitowej.
Devolus,
użycie noty git commit -anic dla mnie nie zrobiło, jednak ustawienie wiadomości w wierszu poleceń zrobiło. Trochę dziwactwa
JonnyRaa
Kolejność poleceń powinna być następująca: # git update-index --chmod=+x script.sh # git ls-tree HEAD # git commit -m "Changing file permissions" # git push
SimonDepelchin
30

Nie działa dla mnie.

Tryb jest prawdą, perms pliku zostały zmienione, ale git mówi, że nie ma pracy.

git init
git add dir/file
chmod 440 dir/file
git commit -a

Problem polega na tym, że git rozpoznaje tylko niektóre zmiany uprawnień.

Otheus
źródło
51
Prawidłowo - gittak naprawdę śledzi tylko, czy plik jest wykonywalny, czy nie, a nie pełny zestaw uprawnień * nix. Musiałbyś więc przełączyć plik między plikiem wykonywalnym / nie, aby pomyśleć, że zmieniłeś coś, co warto popełnić ...
twalberg
Nie mogłem znaleźć przejrzystej dokumentacji: jakiego wyzwalacza po akcji mogę użyć, aby odpowiednio ustawić perms?
Otheus
2
Cóż, istnieje post-checkouthaczyk git, który obejmowałby niektóre przypadki, ale nie jestem pewien, czy obejmie to wszystkie możliwe rzeczy, które aktualizują pliki w twoim środowisku roboczym. Lepiej jest mieć dodatkowy skrypt powłoki w repozytorium, który odpowiednio to wszystko ustawia. Alternatywnie istnieje kilka projektów, które rozszerzają gitprzechowywanie metadanych, ale tak naprawdę nigdy nie próbowałem żadnego z nich ...
twalberg
1
Zmieniłem uprawnienia do pliku na 777 i zrobiłem git update-index --refresh, ale diff pokazuje old mode 100644 new mode 100755. Nie zaktualizował wszystkich uprawnień
hudac
zobacz odpowiedź @tishma tutaj stackoverflow.com/questions/14557106/… . To zadziałało dla mnie
gary69