2012-03-12 9 views
5

Mam repozytorium testów, które umieszczam pod Git. Większość plików jest dość malutka, ale jest ich bardzo dużo i po prostu operacje Git, takie jak dodawanie i status, trwają dziesiątki minut. Jakie są moje możliwości poddania ich kontroli wersji i uzyskaniu rozsądnej wydajności? Czy powinienem spróbować użyć submodułów, czy też powinienem omijać DVCSes?Powolne operacje Git

+0

Na jakim systemie plików pracujesz? – Useless

+3

Git jest znany z tego, że potrafi szybko obsłużyć duże projekty. Czy używasz powolnego systemu plików? –

+0

Uchwyt jest nad systemem NFS, chociaż jego głowa jest bardzo wysokiej klasy. – dromodel

Odpowiedz

12

Operacje Git, takie jak add i status, wymagają stat każdego pliku w systemie plików (aby wykryć zmiany). Masz naprawdę ogromną liczbę plików (powiedzmy dziesiątki lub setki tysięcy plików) lub masz system plików, który ma dość powolną operację stat.

W każdym razie, jeśli potrzebujesz pracować w systemie, w którym jest to bardzo powolne, możesz użyć w indeksie "załóż niezmieniony" bit, który mówi Git, aby nie przejmował się tym plikiem. Jeśli to zrobisz, musisz ręcznie polecić git, aby wykryć zmiany w poszczególnych plikach, np. przekazując je bezpośrednio do git add, w przeciwnym razie Git nawet nie będzie wiedział, że coś się zmieniło. Możesz to włączyć, ustawiając git config core.ignoreStat true, a następnie uruchamiając coś takiego jak git reset --hard HEAD.

+0

Bingo! Nie liczyłem ich, ponieważ obawiam się, ale nie zdziwiłbym się odkryciem, że są to setki tysięcy, a nawet miliony plików, prawie wszystkie generowane przez ludzi. Próbowałem ustawić tę flagę i pomógł nieco w niektórych operacjach, ale wciąż zbyt wolno. Może powinienem stworzyć mnóstwo małych repozytoriów. – dromodel

7

Zastanawiam się, jaka jest tutaj liczba "bardzo duża". Zwykle nie jest to ilość małych plików, które git uważa za kłopotliwe, ale duże pliki binarne. Mogę sobie jednak wyobrazić, że jeśli ilość jest wystarczająco duża, trzeba by je podzielić na kilka repozytoriów - za pomocą podmodułów lub w inny sposób. Jeśli muszą znajdować się w jednym repo, może się okazać, że Subversion jest bardziej wydajny.

EDYCJA: ok, więc dodałeś jako komentarz, że używasz zestawu NFS, który brzmi jak możliwe wąskie gardło tutaj. Proszę sprawdzić rozwiązania na ten temat w this thread. Szczególnie core.preloadindex może być tutaj interesujący.

Od the documentation:

core.preloadindex

Włącz równoległego napięcia wstępnego indeksu dla operacji takich jak git diff

To może przyspieszyć operacje jak git diff i git status szczególnie na systemach plików takie jak NFS, które mają słabą semantykę buforowania, a co za tym idzie, stosunkowo duże opóźnienia IO. Przy tym ustawieniu true, git będzie porównywać indeksy danych z systemu plików równolegle, pozwalając na nakładanie się IO.

EDIT2: w komentarzach wspomniano o 6 milionach plików. Mogę zrozumieć, że staje się to wąskim gardłem - to naprawdę bardzo duża ilość.

+0

Wątpię, czy SVN jest bardziej wydajny niż git - a nawet jeśli jest, git jest znacznie lepszy (według Linusa Torvaldsa jesteś brzydki i głupi, gdy nie używasz Git: p) – ThiefMaster

+0

Cóż, nie musisz brać tylko mojej słowo na to - nawet Linus [zgadza się] (http://stackoverflow.com/questions/984707/what-are-the-git-limits), że w niektórych przypadkach jest to sytuacja. Git działa na repo jako całości, więc nie jest najlepszą opcją w niektórych scenariuszach. – eis

+0

Istnieje kilka plików binarnych. Liczba plików jest znacznie większa niż liczba, jaką można znaleźć w dowolnym projekcie z otwartym kodem źródłowym. – dromodel