Pytanie Jak zmienić Git ignoruje tryb pliku (chmod)?


Mam projekt, w którym muszę zmienić tryb plików chmod do 777 podczas opracowywania, ale które nie powinny się zmienić w głównym repo.

Git odbiera chmod -R 777 . i oznacza wszystkie pliki jako zmienione. Czy istnieje sposób, aby Git ignorował zmiany trybu, które zostały wprowadzone do plików?


1891
2017-10-16 21:43


pochodzenie


Jest to pomocne podczas pracy z git na Windows + Bash w systemie Ubuntu w systemie Windows - Elazar
Dla każdego, kto po prostu chce zignorować zmiany uprawnień dla konkretnego wywołania git diffi dlatego nie chce zmieniać swoich plików konfiguracyjnych Git: możesz użyć git diff -G. za Zed's odpowiedź tutaj. - sampablokuper


Odpowiedzi:


Próbować:

git config core.fileMode false

Od git-config (1):

core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.

The -c flaga może być użyta do ustawienia tej opcji dla jednorazowych poleceń:

git -c core.fileMode=false diff

I --global flaga sprawi, że będzie domyślnym zachowaniem zalogowanego użytkownika.

git config --global core.fileMode false

Ostrzeżenie

core.fileMode nie jest najlepszą praktyką i należy go stosować ostrożnie. To ustawienie obejmuje tylko wykonywalny bit trybu i nigdy bity do odczytu / zapisu. W wielu przypadkach wydaje ci się, że potrzebujesz tego ustawienia, ponieważ zrobiłeś coś takiego chmod -R 777, czyniąc wszystkie pliki wykonywalne. Ale w większości projektów większość plików nie jest potrzebna i nie powinna być wykonywalna ze względów bezpieczeństwa.

Właściwym sposobem rozwiązania tego problemu jest osobne przetwarzanie plików i folderów, z czymś takim jak:

find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write

Jeśli to zrobisz, nigdy nie będziesz musiał użyć core.fileMode, z wyjątkiem bardzo rzadkich środowisk.


3117
2017-10-16 21:53



Jeśli zrobisz git config --global core.filemode false Będziesz musiał zrobić to tylko raz dla wszystkich repo. - Greg
to nie działało dla mnie, dopóki nie naprawiłem sprawy, powinien to być plik fileMode zamiast filemode - tishma
@tishma: sekcja konfiguracji Git i nazwy zmiennych są bez względu na wielkość liter, zgodnie z dokumentacją, zobacz sekcję PLIK KONFIGURACJI, więc jeśli powyższe nie działa dla ciebie, to z innego powodu. - Greg Hewgill
@donquixote: The git config polecenie zapisuje ustawienie do poprawnego pliku konfiguracyjnego (.git/config tylko dla obecnego repozytorium, lub ~/.gitconfig jeśli używany z --global). - Greg Hewgill
@ zx1986: To nie ma znaczenia. Od git config: "W nazwach zmiennych nie ma znaczenia wielkość liter ..." - Greg Hewgill


zmiana trybu cofania w drzewie roboczym:

git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x

Lub w mingw-git

git diff --summary | grep  'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x

247
2018-01-18 02:20



Na OS X Lion, pomiń -d'\n' część z xargs ponieważ jest to nielegalny argument (i nie jest potrzebny). - Pascal
Możesz zignorować wszelkie błędy dotyczące "chmod: brakujący argument po" + x "" - Casey Watson
czy to jest aktualne? Dostaję "chmod: zbyt mało argumentów" w mingw - hammett
@Pascal @pimlottc -d określa ogranicznik do nowej linii zamiast jakichkolwiek białych znaków. BSD xargs nie ma tej opcji, ale zamiast tego możesz przepuścić wyjście tr '\n' '\0' a następnie użyj -0 arg do xargs, aby użyć NUL jako ogranicznika. - Mark Aufflick
Cool, the tr Rzecz zadziałała! Oto pełna komenda dla OSX: git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x - K.-Michael Aye


Jeśli chcesz ustawić tę opcję dla wszystkich swoich repozytoriów, użyj --global opcja.

git config --global core.filemode false

Jeśli to nie zadziała, prawdopodobnie używasz nowszej wersji git, więc spróbuj --add opcja.

git config --add --global core.filemode false

Jeśli uruchomisz go bez opcji --global, a twój katalog roboczy nie jest repozytorium, dostaniesz

error: could not lock config file .git/config: No such file or directory

115
2018-04-21 12:00



Nie działa dla mnie na git w wersji 1.7.9.6 (Apple Git-31.1) - Filip Kunc
Wygląda na to, że później korzysta z GIT --add, jak w git config --add --global core.filemode false - mgaert
Jeśli lokalna konfiguracja repo ma już plik_pliku = true, zmiana globalnej konfiguracji nie pomoże, ponieważ lokalna konfiguracja zastąpi konfigurację globalną. Będzie musiał zmienić lokalną konfigurację każdego repo na komputerze raz - Syed Rakib Al Hasan
PROSZĘ: Zaktualizuj tę odpowiedź ostrzeżeniem syedrakib! Wszystko stało się szalone, zanim je znalazłem, a potem miałem po prostu sens. - jerclarke


Gdyby

git config --global core.filemode false

nie działa dla ciebie, rób to ręcznie:

cd into yourLovelyProject folder

cd do folderu .git:

cd .git

edytuj plik konfiguracyjny:

nano config

zmień wartość true na false

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

zapisz, wyjdź, przejdź do wyższego folderu:

cd ..

reinicjuj git

git init

gotowe!


66
2017-08-06 13:10



Zamiast edytować .git/config, prosty git config core.fileMode false w katalogu głównym twojego projektu wystarczy. Jeśli edytujesz plik konfiguracyjny, lepszym rozwiązaniem jest całkowite usunięcie dyrektywy, tak aby została pobrana wersja globalna. - Felix
-1 jeśli git config --global nie działa, oznacza to, że nie masz uprawnień, aby zrobić to na poziomie systemu, usuwając global opcja robi dokładnie to samo, co ręczna edycja .git / config - CharlesB
@CharlesB incorrect - odpowiedź dostarczyła obejścia, umieszczając opcję bezpośrednio w projekcie, czyniąc ją specyficzną dla projektu. To nie zadziała z innymi projektami git, które tworzysz / kupujesz w przyszłości, ale działa dla projektu, nad którym pracujesz. (upewnijmy się, że się rozróżniamy ~/.gitconfig, i ~/project/.git/config) - sircapsalot
Po uruchomieniu git init czy powinniśmy ustawić filemode z powrotem na true? - Jordan


Dodanie do Greg Hewgill odpowiedział (używanie core.fileMode zmienna config):

Możesz użyć --chmod=(-|+)x opcja git update-index (niskopoziomowa wersja "git add") zmieniająca uprawnienia wykonywania w indeksie, skąd zostanie pobrana, jeśli użyjesz "git commit" (a nie "git commit -a").


48
2017-10-16 22:03



Powinno to zostać zredagowane w odpowiedzi Grega Hewgilla, a nie dodane jako oddzielna odpowiedź, tworząc jedną najwyższą odpowiedź z pojedynczą jednoznaczną reprezentacją. - Greg
@Greg: Trzeba mieć wystarczająco dużo punktów, aby edytować własną odpowiedź; Myślę, że w tym czasie nie miałem wystarczających uprawnień do edytowania. - Jakub Narębski
@Jakub Myślę, że masz teraz wystarczająco dużo reputacji :) Jak wyglądałoby to polecenie dla przykładowego pliku? - Alex Hall


Możesz skonfigurować go globalnie:

git config --global core.filemode false

Jeśli powyższe nie działa, przyczyną może być to, że lokalna konfiguracja przesłania globalną konfigurację.

Usuń lokalną konfigurację, aby globalna konfiguracja zaczęła działać:

git config --unset core.filemode

Alternatywnie możesz zmienić konfigurację lokalną na właściwą wartość:

git config core.filemode false


32
2018-01-21 09:12



Jeśli główna odpowiedź nie pomoże ci - spróbuj tego. Jeśli chcesz sprawdzić lokalną konfigurację bez jej modyfikacji, zaznacz git config -l (wyświetla aktualną konfigurację - lokalną i globalną) - Krzysztof Bociurko


Jeśli użyłeś chmod polecenie już wtedy sprawdź różnicę pliku, Pokazuje poprzedni tryb pliku i bieżący tryb pliku, taki jak:

nowy tryb: 755

stary tryb: 644

ustawić stary tryb wszystkich plików za pomocą poniższego polecenia

sudo chmod 644 .

teraz ustaw core.fileMode na false w pliku konfiguracyjnym za pomocą komendy lub ręcznie.

git config core.fileMode false

następnie użyj polecenia chmod, aby zmienić uprawnienia wszystkich plików, takich jak

sudo chmod 755 .

i ponownie ustaw core.fileMode na true.

git config core.fileMode true

Aby uzyskać najlepsze praktyki, nie należy zawsze przechowywać wartości core.fileMode.


16
2017-10-13 07:34



Mówisz, że cały projekt (w fazie rozwoju, inscenizacji i produkcji) powinien wynosić 755? - Daniel
@Daniel Lut: Nie. Zmień tylko tryb niezbędnych plików. - Kishor Vitekar
For best practises don't Keep core.fileMode false always co masz na myśli, powinieneś to wyjaśnić. - bg17aw
For best practises don't Keep core.fileMode false always. Niektóre systemy plików (na przykład FAT) nie obsługują uprawnień do plików, więc system operacyjny zgłasza domyślną wartość (w każdym razie 766). W tym przypadku, core.filemode jest absolutnie konieczne w lokalnej konfiguracji, chyba że chcesz nadpisać historię commitów niepotrzebnymi i niezamierzonymi zmianami uprawnień - KevinOrr
Poza tym, dlaczego w ogóle zmieniasz perms? Jeśli ustawisz core.filemode=false wtedy git zignoruje wykonanie bitowych zmian, bez potrzeby zmiany lokalnych uprawnień. O ile nie dodałeś już zmian uprawnień do indeksu, w takim przypadku brakuje Ci kroku, w którym musisz git add po wyłączeniu core.filemode. - KevinOrr


Jeśli chcesz, aby plik plikowy był rekursywnie rekompensowany (w tym podmoduły): find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'


14
2017-07-16 12:23



To nie zadziała, jeśli ta linia nie znajduje się w pliku konfiguracyjnym. Jeśli chcesz go zmienić na submoduły, spróbuj tego: git submodule foreach git config core.fileMode false - courtlandj


Definiując następujący alias (in ~ / .gitconfig) możesz łatwo tymczasowo wyłączyć komendę fileMode per git:

nfm = "!f(){ git -c core.fileMode=false $@; };f"

Kiedy ten alias jest poprzedzony komendą git, zmiany trybu pliku nie pojawią się z poleceniami, które w przeciwnym razie byłyby wyświetlane. Na przykład:

git nfm status

14
2017-07-24 15:01





Proste rozwiązanie:

Uderz w to Proste pochwały w folderze projektu (nie usunie twoich pierwotnych zmian) ... to tylko usuń zmiany co było Gotowe podczas gdy się zmieniłeś uprawnienie do folderu projektu

pochwała jest poniżej:

git config core.fileMode false

Dlaczego ten niepotrzebny plik jest modyfikowany: ponieważ zmieniłeś uprawnienia do folderu projektu z wyróżnieniem sudo chmod -R 777 ./yourProjectFolder

kiedy sprawdzisz zmiany, czego nie zrobiłeś? znalazłeś jak poniżej podczas korzystania git nazwa pliku diff

enter image description here


1
2018-03-19 13:13





To działa dla mnie:

find . -type f -exec chmod a-x {} \;

lub wstecz, w zależności od systemu operacyjnego

find . -type f -exec chmod a+x {} \;

0
2018-04-30 15:06