Jak wytrzymałe są Git, gdy moc gaśnie?

24

Pewnego dnia korzystałem z Git (nadal go używam) i podczas gdy popełniłem prąd, prąd spadł.

Kiedy wróciłem (właściwie prąd), repozytorium git było uszkodzone. Nie pamiętam dokładnej nazwy, ale było to coś w rodzaju „nieprawidłowych referencji” lub coś w tym rodzaju.

Łatwo zgadnąć, że zatwierdzenie zostało przerwane w trakcie operacji (zatwierdzałem przez IntelliJ, który automatycznie dodaje indeksy). Łatwo było też zgadnąć, że tak naprawdę „zatwierdzenie” nie jest tak ACID, jak operacja DBMS o tej samej nazwie.

P : Czy istnieje sposób, aby zapewnić, że operacje zmiany repo są zgodne z atomowością? tzn. jeśli prąd znowu spadnie, a ja się zobowiązuję, chciałbym, aby mój system plików nie był w stanie uszkodzonym.

Luis Masuelli
źródło
10
Kup UPS? .....
Robert Harvey
zrobić codzienną kopię zapasową?
maniak zapadkowy
To nie rozwiązuje problemu - wyobraź sobie, że repozytorium git znajduje się na serwerze, a ja PUSH z repozytorium lokalnego, a podczas przyswajania zatwierdzenia na serwerze energia ponownie spada. Ten sam problem, ale tym razem bez obecności człowieka.
Luis Masuelli

Odpowiedzi:

10

Nie wiem, czy istnieje sposób na to, aby zobowiązania Git przetrwały awarie zasilania w określonym czasie, ale możesz naprawić swoje repozytorium.

Obiekty Git powinny być niezmienne, więc wszystkie starsze zmiany powinny być nadal aktualne. Zgodnie z tą odpowiedzią możesz zmienić skrót w .git/refs/heads/<branch-name>celu zmiany nagłówka gałęzi, nad którą pracowałeś, na poprzednie zatwierdzenie (możesz je zobaczyć .git/logs/HEAD).

Komentarz do tej odpowiedzi mówi, że ta metoda „Nadal pozostawia repozytorium w stanie uszkodzonym, ale pozwala to na jego odzyskanie”. Nie testowałem tego (nie mam pojęcia, jak odtworzyć twoją sytuację), ale zakładam, że odzyskiwanie odbywa się za pośrednictwem git gc, które usunie uszkodzone zatwierdzenie.

Idan Arye
źródło
6
„nie mam pojęcia, jak odtworzyć sytuację” Wyciągnij wtyczkę? ;)
yannis
3
@YannisRizos Może gdyby to był SVN, ale zatwierdzenia Git są zbyt szybkie dla ludzkich umiejętności pomiaru czasu ...
Idan Arye
5
Git jest open source, prawda? Aby odtworzyć problem, zbuduj kod, ustaw punkt przerwania przed zapisaniem danych na dysku - a następnie wyciągnij wtyczkę.
John Saunders
10

System pamięci masowej Git nie jest transakcyjny, więc z pewnością istnieje szansa, że ​​problem sprzętowy może pozostawić rzeczy w niespójnym stanie. Z drugiej strony, Git jest również bardzo szybki, więc trzeba mieć naprawdę pecha, aby zostać dotkniętym problemami typu „awaria zasilania” (systematyczne problemy z dyskiem to coś innego). Prędkość wynika częściowo z faktu, że nie jest transakcyjna; transakcje są naprawdę dość drogie, ponieważ muszą czekać na potwierdzenie z dysku, że zapisał dane. (Bazy danych robią różne rzeczy, aby ukryć ten koszt, ale ostatecznie płacą cenę. Niektóre konkurencyjne DVCS transakcyjne i tak, są nieco wolniejsze na tym samym sprzęcie co git.)

W najgorszym przypadku - całkowita katastroficzna awaria dysku (co widziałem, że się zdarzyło) - jedynym sposobem na odzyskanie DVCS jest wykorzystanie faktu, że jest on rozpowszechniany. Jeśli do niedawna przekazałeś swoje zmiany do innego systemu i udostępnili je one wielu różnym hostom, odzyskiwanie jest tylko kwestią wykorzystania jednego z tych innych miejsc jako źródła artefaktów, miejsca, z którego można pobrać gałęzie ( nawet jeśli tylko chwilowo). W ten sposób wciągniesz z powrotem historię interesujących gałęzi i będziesz mógł bardzo szybko znów zacząć działać; wszystko, co usuwa jednocześnie wiele rozproszonych kopii repozytorium, jest albo katastrofą, w której nie musisz martwić się późniejszym programowaniem (pomyśl o dużym uderzeniu meteorytu), albo wręcz działaniem wroga. (Staraj się nie robić takich wrogów ...) Jest to całkowity kontrast z systemami nie rozproszonymi, w których utrata centralnego serwera, który obsługuje wszystko, jest śmiertelnym ciosem.

Donal Fellows
źródło
5
Jeśli nie naciskasz gałęzi, nie przechowujesz kopii zapasowych i nie masz UPS, możesz obwiniać tylko, jeśli problemy sprzętowe zmienią wszystko. Masz narzędzia…
Donal Fellows
1
Czy nie ma żadnego sposobu ani wtyczki, aby zapewnić, że operacje git są transakcyjne? Gdyby taka opcja - lub wtyczka - istniała, nie dbałbym o to, że (tj. Operacje) są wolniejsze. Na szczęście nie mam problemów ze sprzętem. Niestety energia często się wyłącza (mówiąc, że raz na dwa tygodnie ma swoją obecność) w tym budynku, a ja cały czas koduję i nie mam UPS. Na szczęście zmieniłem (sklonowałem / zepchnąłem) go na github. Niestety tracę trochę czasu, kiedy muszę wszystko wycofać i ponownie odtworzyć projekt.
Luis Masuelli
2
Częste przerwy w dostawie prądu podczas pracy oznaczają, że naprawdę zwiększasz ryzyko uszkodzenia systemu plików, jeśli nie uszkodzenia sprzętu. Zastanawiam się, dlaczego nie zastanawiasz się nad zakupem UPS, który rozwiązałby większość opisanych problemów i prawdopodobnie byłby najlepszą odpowiedzią.
Bart Silverstrim