2012-10-23 9 views
7

Istnieją dwa scenariusze, że jestem zainteresowany.Czy możliwe są równoczesne operacje z repozytoriami Git?

  • Repozytorium jest wspólna i dwóch użytkowników ma pchnąć nim zmian jednocześnie
  • Chcę zaplanować nocne lub tygodniowe „GC” przy użyciu zadania cron. Działa i ktoś chce pchać lub klonować podczas operacji.

Czy istnieje ryzyko korupcji w którymkolwiek z tych scenariuszy?

+0

Dla # 1, zakładam, że mówisz o równoczesnych popychaczach do różnych gałęzi? Jednoczesne popychanie do tej samej gałęzi jest odpowiedziana w innym miejscu na SO. – cmbuckley

+0

Czy możesz podać link? – dromodel

+2

[q8424232] (http: // stackoverflow.com/questions/8424232/is-concurrent-git-pushes-always-safe-if-the-second-push-only-has-fast-forward); [q6028141] (http://stackoverflow.com/questions/6028141/concurrent-git-pull-and-push-on-same-remote-repo-from-different-locations) również mogą być interesujące. – cmbuckley

Odpowiedz

7

Git pozwala na równoczesne operacje przy użyciu Pessimistic Concurrency Control.

W razie potrzeby git tworzy specjalne pliki, które działają jako zamki.

W szczególności za każdym razem, gdy indeks jest modyfikowany przez operację, git tworzy plik o nazwie index.lock w katalogu .git, aby zablokować udostępniony zasób. Git tworzy na potrzeby innych plików blokujących: na przykład plik .keep jest tworzony podczas operacji git index-pack.

Ogólnie nie powinieneś martwić się o równoległe operacje z git: jest on starannie zaprojektowany, aby je wspierać.

Ktoś może powiedzieć, że nie powinieneś się martwić o wykonanie gc z zadaniem cron, ponieważ git sam od czasu do czasu uruchamia gc. Nawet jeśli to prawda, sama man page poleca:

Users are encouraged to run this task on a regular basis 
within each repository to maintain good disk space utilization 
and good operating performance. 

Stąd, myślę, że nie jest to zły pomysł, aby zaplanować zadanie pracy, aby uruchomić zbieranie śmieci jest git. Zastanawiam się tylko, czy jest to przedwczesna optymalizacja, czy też próbujesz rozwiązać prawdziwy, wymierzony problem. Osobiście nigdy nie miałem problemów, które wymagałyby ręcznego uruchomienia gc, ale nie byłbym zaskoczony, gdyby twoja sprawa była całkiem inna.

2

Ogólnie "git gc" może usuwać obiekty, których używa inny proces współbieżny , ale nie utworzył odniesienia.
Git 2.12 (Q1 2017) ma więcej na ten temat.

Zobacz commit f1350d0 (15 listopada 2016) przez Matt McCutchen (mattmccutchen).
(Scalony przez Junio C Hamano -- gitster -- w commit 979b82f, 10 Jan 2017)

I zobaczyć Jeff King's comment:

Nowoczesne wersje git zrobić dwie rzeczy, aby pomóc z tym:

  • dowolny obiekt która jest przywoływana przez "ostatni" obiekt (w ciągu 2 tygodni) jest również uważana za ostatnią.Więc jeśli utworzyć nowy popełnić obiekt, który wskazuje na drzewie, zanim jeszcze odwołać zatwierdzenie że drzewo jest chroniony

  • gdy zapis obiektu jest zoptymalizowany, bo mamy już obiekt git zaktualizuje mtime do pliku (w luźnym obiektu lub packfile), aby odświeżyć to

to nie jest doskonały, choć. Możesz odwołać się do istniejącego obiektu w momencie, gdy jest on usuwany. A sam proces przycinania nie jest atomowy (i tak trudno to zrobić, tylko dlatego, że jesteśmy obiecani przez system plików).

Jeśli masz długo działające dane (takie jak tymczasowy plik indeksu, który może dosłownie siedzieć przez kilka dni lub tygodni) Myślę, że jest to potencjalny problem . Rozwiązaniem jest prawdopodobnie użycie w niektórych przypadkach odwołań do obiektów .
Jeśli martwisz się o krótkoterminową operację, w której ktoś zdarzy się jednocześnie uruchomić git-gc, to zgadzam się, że jest to możliwy problem z numerem , ale podejrzewam, że coś możesz zignorować w praktyce.

Dla dużego serwera z wieloma użytkownikami zalecam całkowite wyłączenie funkcji auto-gc, i przepakowanie ręcznie z "-k", aby było po bezpiecznej stronie.

Dlatego git gc man page obejmuje obecnie:

Z drugiej strony, gdy „git gc” biegnie równolegle z innym procesem, istnieje ryzyko z tym usunięciem obiektu, że drugi proces jest przy użyciu ale nie utworzył odniesienia do. Może to po prostu spowodować, że inny proces nie powiedzie się lub może uszkodzić repozytorium, jeśli drugi proces później doda odniesienie do usuniętego obiektu.

Git posiada dwie funkcje, które znacznie złagodzić ten problem:

  • dowolny obiekt z czasem modyfikacji nowsza niż data --prune utrzymuje, wraz ze wszystkim osiągalny od niego.

  • Większość operacji, które dodają obiekt do bazy danych, aktualizuje czas modyfikacji obiektu, o ile jest już dostępny, aby mieć zastosowanie # 1 .

Jednak te cechy spadną kompletnego rozwiązania, więc użytkownicy, którzy Polecenia prowadzony równocześnie żyć z pewnym ryzykiem korupcji (która wydaje się być niska w praktyce), o ile nie wyłączy automatyczne śmieci kolekcja z 'git config gc.auto 0'.

Powiązane problemy