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.
Odpowiedzi:
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.źródło
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 są 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.
źródło