Mam projekt, w którym muszę zmieniać tryb plików chmod
na 777 podczas opracowywania, ale który nie powinien się zmieniać w głównym repozytorium.
Git podnosi chmod -R 777 .
i zaznacza wszystkie pliki jako zmienione. Czy istnieje sposób, aby Git ignorował zmiany trybu, które zostały wprowadzone w plikach?
git diff
, iw związku z tym nie chce zmieniać swoje pliki konfiguracyjne Git: można używaćgit diff -G.
za Zed za odpowiedź tutaj .Odpowiedzi:
Próbować:
Z git-config (1) :
Za pomocą
-c
flagi można ustawić tę opcję dla poleceń jednorazowych:A
--global
flaga sprawi, że będzie to domyślne zachowanie dla zalogowanego użytkownika.Zmiany ustawienia globalnego nie zostaną zastosowane do istniejących repozytoriów. Dodatkowo,
git clone
igit init
jawnie ustawićcore.fileMode
abytrue
w config repo jak omówiono w Git globalny core.fileMode FAŁSZ przesłonięte lokalnie na klonieOstrzeżenie
core.fileMode
nie jest najlepszą praktyką i należy ją stosować ostrożnie. To ustawienie obejmuje tylko wykonywalny bit trybu, a nigdy bity do odczytu / zapisu. W wielu przypadkach uważasz, że potrzebujesz tego ustawienia, ponieważ zrobiłeś coś podobnegochmod -R 777
, czyniąc wszystkie swoje pliki wykonywalnymi. Jednak w większości projektów większość plików nie potrzebuje i nie powinna być wykonywalna ze względów bezpieczeństwa .Właściwym sposobem rozwiązania tego rodzaju sytuacji jest osobne zarządzanie uprawnieniami do folderów i plików za pomocą:
Jeśli to zrobisz, nigdy nie będziesz musiał używać
core.fileMode
, z wyjątkiem bardzo rzadkiego środowiska.źródło
git config --global core.filemode false
, musisz to zrobić tylko raz dla wszystkich repozytoriów.git config
Komenda zapisuje ustawienie do poprawnego pliku konfiguracyjnego (.git/config
tylko dla bieżącego repozytorium lub~/.gitconfig
jeśli jest używane z--global
).zmiana trybu cofania w działającym drzewie:
Lub w mingw-git
źródło
-d'\n'
część,xargs
ponieważ jest to nielegalny argument (i nie jest potrzebny).tr '\n' '\0'
a następnie użyć-0
arg do xargs, aby użyć NUL jako separatora.tr
rzecz zadziałała! Oto pełne polecenie dla OSX:git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x
Jeśli chcesz ustawić tę opcję dla wszystkich swoich repozytoriów, użyj tej
--global
opcji.Jeśli to nie zadziała, prawdopodobnie używasz nowszej wersji git, więc wypróbuj
--add
opcję.Jeśli uruchomisz go bez opcji --global, a katalog roboczy nie jest repozytorium, otrzymasz
źródło
--add
, jak wgit config --add --global core.filemode false
Gdyby
nie działa dla Ciebie, zrób to ręcznie:
cd do folderu .git:
edytuj plik konfiguracyjny:
zmień wartość true na false
->
zapisz, wyjdź, przejdź do górnego folderu:
ponownie uruchom git
gotowe!
źródło
.git/config
wystarczy prostygit config core.fileMode false
element główny projektu. Jeśli edytujesz plik konfiguracyjny, lepiej całkowicie usunąć dyrektywę, aby pobrać globalny.global
opcji robi dokładnie to samo, co ręczne edytowanie .git / config~/.gitconfig
~/project/.git/config
git init
należy ponownie ustawić tryb pliku na true?Dodanie do odpowiedzi Grega Hewgilla (przy użyciu
core.fileMode
zmiennej config):Możesz użyć
--chmod=(-|+)x
opcji git update-index (niskopoziomowa wersja „git add”), aby zmienić uprawnienia do wykonywania w indeksie, skąd zostanie on odebrany, jeśli użyjesz „git commit” (a nie „git commit -a „).źródło
Możesz to skonfigurować globalnie:
git config --global core.filemode false
Jeśli powyższe nie działa, przyczyną może być to, że konfiguracja lokalna zastępuje konfigurację globalną.
Usuń konfigurację lokalną, aby włączyć globalną konfigurację:
git config --unset core.filemode
Alternatywnie możesz zmienić konfigurację lokalną na odpowiednią wartość:
git config core.filemode false
źródło
git config -l
(wyświetl aktualną konfigurację - zarówno lokalną, jak i globalną)Jeśli używałeś już komendy chmod, sprawdź różnicę pliku, pokazuje poprzedni tryb pliku i bieżący tryb pliku, taki jak:
nowy tryb: 755
stary tryb: 644
ustaw stary tryb wszystkich plików za pomocą poniższego polecenia
sudo chmod 644 .
teraz ustaw core.fileMode na false w pliku konfiguracyjnym za pomocą polecenia lub ręcznie.
następnie zastosuj polecenie chmod, aby zmienić uprawnienia wszystkich plików, takich jak
i ponownie ustaw core.fileMode na true.
W celu uzyskania najlepszych praktyk nie rób zawsze core.fileMode false.
źródło
For best practises don't Keep core.fileMode false always
co masz na myśli, powinieneś to wyjaśnić.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łosi wartość domyślną (766 w moim systemie i tak). W takim przypadkucore.filemode
jest to absolutnie konieczne w konfiguracji lokalnej, chyba że chceszcore.filemode=false
git zignoruje zmiany bitów, nie musisz zmieniać lokalnych uprawnień. O ile nie dodałeś już zmian uprawnień do indeksu, w takim przypadku brakuje kroku, w którym musisz to zrobićgit add
po wyłączeniucore.filemode
.Definiując następujący alias (w ~ / .gitconfig), możesz łatwo tymczasowo wyłączyć tryb fileMode dla polecenia git:
Gdy ten alias ma prefiks do komendy git, zmiany trybu plików nie pojawią się wraz z poleceniami, które w przeciwnym razie by je pokazały. Na przykład:
źródło
Jeśli chcesz ustawić tryb pliku na false w plikach konfiguracyjnych rekurencyjnie (w tym w podmodułach):
find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'
źródło
git submodule foreach git config core.fileMode false
Proste rozwiązanie:
Hit tego prostego polecenia w folderze projektu ( nie usunie oryginalne zmian) ... to będzie tylko usunąć zmiany , które zostały zrobione podczas zmienił uprawnienia folderu projektu
polecenie jest poniżej:
git config core.fileMode false
Dlaczego cały ten niepotrzebny plik jest modyfikowany: ponieważ zmieniłeś uprawnienia do folderu projektu poleceniem sudo chmod -R 777 ./yourProjectFolder
kiedy sprawdzisz zmiany, czego nie zrobiłeś? znalazłeś jak poniżej podczas używania nazwy pliku git diff
źródło
To działa dla mnie:
lub odwrotnie, w zależności od systemu operacyjnego
źródło