Mam repozytorium 10 GB na komputerze z systemem Linux na NFS. Pierwszy raz git status
zajmuje 36 minut, a kolejny git status
8 minut. Wygląda na to, że Git zależy od systemu operacyjnego do buforowania plików. Tylko pierwsze git
polecenia podoba commit
, status
że obejmuje pakiet / zapakować cały repo trwa bardzo długo na ogromnym repo. Nie jestem pewien, czy używałeś git status
na tak dużym repozytorium, ale czy ktoś spotkał się z tym problemem?
Próbowałem git gc
, git clean
, git repack
ale czas potrzebny jest jeszcze / prawie tak samo.
Czy podmoduły lub inne koncepcje, takie jak rozbicie repozytorium na mniejsze, pomogą? Jeśli tak, który jest najlepszy do podziału większego repozytorium. Czy istnieje inny sposób na skrócenie czasu potrzebnego na polecenia git w dużym repozytorium?
źródło
Odpowiedzi:
Aby być bardziej precyzyjnym, git zależy od wydajności
lstat(2)
wywołania systemowego, więc poprawianie „limitu czasu pamięci podręcznej atrybutów” klienta może załatwić sprawę.Podręcznik dla
git-update-index
- zasadniczo tryb ręczny dlagit-status
- opisuje, co możesz zrobić, aby temu zaradzić, używając--assume-unchanged
flagi, aby powstrzymać jego normalne zachowanie i ręcznie zaktualizować ścieżki, które zmieniłeś. Możesz nawet zaprogramować swój edytor tak, aby usuwał tę flagę za każdym razem, gdy zapisujesz plik.Alternatywą, jak sugerujesz, jest zmniejszenie rozmiaru kasy (rozmiar plików paczek tak naprawdę nie ma tutaj znaczenia). Dostępne opcje to rzadkie płatności, moduły podrzędne lub narzędzie repozytorium Google .
(Istnieje wątek na liście dyskusyjnej o używaniu Git z NFS , ale nie zawiera on odpowiedzi na wiele pytań).
źródło
core.preloadindex
na true - zobaczgit-config
dokumentację, aby uzyskać trochę więcej opisu. (Moje miejsce pracy korzysta z NFS i napotkałem dokładnie ten problem - ale nigdy nie zauważyłem ustawienia preloadindex. Dziękujemy za wskazanie mi właściwej drogi!)core.preloadindex
flaga jest domyślnie ustawiona na true od Git 2.1.0: git.kernel.org/pub/scm/git/git.git/tree/Documentation/RelNotes/…Widzę również ten problem w dużym projekcie udostępnianym przez NFS.
Zajęło mi trochę czasu, zanim odkryłem flagę -uno, którą można nadać zarówno git commit, jak i git status.
Ta flaga wyłącza wyszukiwanie nieśledzonych plików. Zmniejsza to znacznie liczbę operacji nfs. Powodem jest to, że aby git mógł wykryć nieśledzone pliki, musi przeszukać wszystkie podkatalogi, więc jeśli masz wiele podkatalogów, zaszkodzi ci to. Wyłączając git możliwość wyszukiwania nieśledzonych plików, eliminujesz wszystkie te operacje NFS.
Połącz to z flagą core.preloadindex, a uzyskasz rozsądną wydajność nawet na NFS.
źródło
status.showUntrackedFiles
plik config.Spróbuj git gc . Pomocne może też być git clean .
AKTUALIZACJA - Nie jestem pewien, skąd się wzięło głosowanie negatywne, ale podręcznik git wyraźnie stwierdza:
Zawsze zauważam różnicę po uruchomieniu git gc, gdy status git jest wolny!
UPDATE II - Nie wiem, jak to przegapiłem, ale OP już próbował
git gc
igit clean
. Przysięgam, że tego nie było, ale nie widzę żadnych zmian w edycjach. Przepraszam za to!źródło
git gc
skrócić czasgit log
uruchamiania z 15 sekund do 0 w jednym z moich repozytoriów.Jeśli Twoje repozytorium git w dużym stopniu korzysta z modułów podrzędnych, możesz znacznie przyspieszyć działanie statusu git, edytując plik konfiguracyjny w katalogu .git i ustawiając
ignore = dirty
dowolne szczególnie duże / ciężkie moduły podrzędne. Na przykład:Stracisz wygodę przypomnienia, że w którymkolwiek z modułów podrzędnych nastąpiły niestacjonarne zmiany, o których być może zapomniałeś, ale nadal zachowasz główną wygodę, jaką jest wiedza, kiedy podmoduły nie są zsynchronizowane z głównym repozytorium. Ponadto nadal możesz zmienić swój katalog roboczy na sam moduł podrzędny i jak zwykle używać w nim statusu git, aby zobaczyć więcej informacji. Zobacz to pytanie, aby uzyskać więcej informacji o tym, co oznacza „brudny”.
źródło
Wydajność statusu git powinna ulec poprawie w Git 2.13 (Q2 2017).
Zobacz commit 950a234 (14 kwietnia 2017) autorstwa Jeffa Hostetlera (
jeffhostetler
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu 8b6bba6 , 24 kwietnia 2017)>
string-list
: użyjALLOC_GROW
makra podczas ponownego przydzielaniastring_list
Dodatkowo, Git 2.17 (Q2 2018) wprowadzi nowy ślad, do pomiaru czasu spędzanego na operacjach z dużą liczbą indeksów.
Zobacz commit ca54d9b (27 stycznia 2018) autorstwa Nguyễn Thái Ngọc Duy (
pclouds
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu 090dbea , 15 lutego 2018 r.)Ten sam Git 2.17 (Q2 2018) poprawia się
git status
dzięki:commit f39a757 , commit 3ca1897 , commit fd9b544 , commit d7d1b49 (09 stycznia 2018) autor: Jeff Hostetler (
jeffhostetler
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu 4094e47 , 08 marca 2018 r.)"
git status
" Może spędzić wiele cykli na obliczeniu relacji między bieżącą gałęzią a jej upstreamem, którą można teraz wyłączyć--no-ahead-behind
opcją " ".commit ebbed3b (25 lutego 2018) przez Derrick Stolee (
derrickstolee
) .Git 2.24 (Q3 2019) proponuje inne ustawienie poprawiające
git status
wydajność:Zobacz commit aaf633c , commit c6cc4c5 , commit ad0fb65 , commit 31b1de6 , commit b068d9a , commit 7211b9e (13 sierpnia 2019) autorstwa Derrick Stolee (
derrickstolee
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu f4f8dfe , 09 września 2019)Ale:
W Git 2.24 (Q4 2019) ścieżka kodu odczytująca
index.version
konfigurację została zerwana podczas niedawnej aktualizacji, która została poprawiona.Zobacz commit c11e996 (23 października 2019) autorstwa Derrick Stolee (
derrickstolee
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu 4d6fb2b , 24 października 2019)źródło
index.threads
ustawienie konfiguracjigit config --global core.preloadIndex true
Wykonał robotę za mnie. Sprawdź oficjalną dokumentację tutaj .
źródło
2.7.4
. Używam podsystemu Linux dla Windows i nawet zaktualizowanyapt-get
wydaje się mieć odniesienia do dość starych pakietów.W naszej bazie kodów, w której mamy gdzieś w zakresie 20-30 podmodułów,
git status --ignore-submodules
znacznie przyspieszyło to dla mnie. Zwróć uwagę, że nie spowoduje to raportu o stanie podmodułów .
źródło
Coś, o czym jeszcze nie zostało wspomniane, to aktywacja pamięci podręcznej systemu plików na komputerach z systemem Windows (systemy plików linux są zupełnie inne i git został dla nich zoptymalizowany, dlatego prawdopodobnie pomaga to tylko w systemie Windows).
W ostateczności, jeśli git nadal działa wolno, można wyłączyć kontrolę czasu modyfikacji, aby git musiał dowiedzieć się, które pliki uległy zmianie.
ALE: Zmienione pliki muszą być później dodane przez samego programistę za pomocą
git add
. Git sam nie znajduje zmian.źródło
źródło
Pozostałe
index.lock
plikigit status
może być patologicznie powolny w przypadku pozostawieniaindex.lock
plików.Dzieje się tak zwłaszcza, gdy masz
git submodules
, bo wtedy często nie zauważysz takich plików po lewej stronie.Podsumowanie: Uruchom
find .git/ -name index.lock
i usuń pozostałe pliki po sprawdzeniu, czy rzeczywiście nie są używane przez żaden aktualnie działający program.Detale
Zauważyłem, że mój status git powłoki był bardzo powolny w moim repozytorium, z git 2.19 na Ubuntu 16.04.
Wkopałem się i stwierdziłem, że
/usr/bin/time git status
w moimassets
module podrzędnym git zajęło to 1,7 sekundy.Znaleziony z
strace
tym gitem, przeczytaj wszystkie moje duże pliki zmmap
. Zwykle tego nie robi, zwyklestat
wystarczy.Przeszukałem problem w Google i znalazłem problem z użyciem indeksu i Racy Git .
Próbowałem
git update-index somefile
(w moim przypadkugitignore
w kasie modułu podrzędnego) pokazane tutaj, ale nie udało sięTo klasyczny błąd. Zwykle zauważasz to podczas dowolnej operacji git, ale w przypadku modułów podrzędnych, do których często się nie angażujesz, możesz nie zauważyć tego przez miesiące, ponieważ pojawia się tylko podczas dodawania czegoś do indeksu; ostrzeżenie nie jest zgłaszane tylko do odczytu
git status
.Usunięcie
index.lock
plikugit status
stało się natychmiastowe,mmaps
zniknęło i jest teraz ponad 1000x szybsze.Więc jeśli twój status gita jest nienaturalnie wolny, sprawdź
find .git/ -name index.lock
i usuń resztki.źródło
To dość stare pytanie. Chociaż jestem zaskoczony, że nikt nie skomentował pliku binarnego ze względu na rozmiar repozytorium.
Wspomniałeś, że twoje repozytorium git ma ~ 10 GB. Wygląda na to, że oprócz problemu z NFS i innych problemów z gitem (rozwiązywalnym przez
git gc
i zmiana konfiguracji git jako zarys w innych odpowiedziach), polecenia git (status git, git diff, git add) mogą być powolne z powodu dużej liczby plików binarnych w repozytorium . git nie radzi sobie dobrze z plikiem binarnym. Możesz usunąć niepotrzebny plik binarny za pomocą następującego polecenia (przykład podano dla pliku NetCDF; wcześniej wykonaj kopię zapasową repozytorium git):git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch *.nc' \ --prune-empty --tag-name-filter cat -- --all
Nie zapomnij wstawić „* .nc” do pliku gitignore, aby uniemożliwić gitowi ponowne uruchomienie pliku.
źródło