2009-06-08 8 views
29

Niedawno moja główna maszyna, której używam do programowania, zaczęła się przegrzewać. Zacząłem dostawać 4 lub 5 blokad dziennie. Wszystko zawiesza się. Wszystkie moje projekty są pod kontrolą wersji przy użyciu git.Integralność pliku Git

Pamiętam, jak oglądałem w Google rozmowę Linusa, mówiąc, że git zapewni, że pliki nie są uszkodzone. W mojej sytuacji można bezpiecznie założyć, że git ostrzeże mnie, gdy jeden z plików źródłowych zostanie uszkodzony.

OS to system plików Mac OS X 10.4 to HFS +.

Odpowiedz

36

Możesz wymusić na Git sprawdzenie całego repozytorium za pomocą git fsck. Jeśli repozytorium Git zostanie uszkodzone, powinieneś otrzymać nowy klon z nieuszkodzonego repozytorium.

Podczas normalnej pracy Git powinien sprawdzać części repozytorium podczas ich odczytywania, więc może to potrwać dłużej, zanim zauważysz jakieś uszkodzenie, ale zostanie ono zauważone za pierwszym razem, gdy spróbujesz uzyskać dostęp do uszkodzonych danych.

+5

Co się stanie, jeśli starają się wcisnąć na pilocie? Zanim zauważysz korupcję, czy to również psuje zdalnika lub narzeka? –

+5

Przesyłanie do pilota oznacza spakowanie wszystkich plików razem, a odbiornik (do którego naciskasz) musi ponownie przeliczyć SHA1 wszystkich plików. Więc jeśli jakiś plik był uszkodzony, identyfikatory obiektów na drzewach zaczynałyby się niedopasować i pojawiałaby się korupcja - i zawsze możesz cofnąć się do miejsca, w którym byłeś wcześniej i zrobić fuksa git, aby znaleźć problemy po twojej stronie . – araqnid

+5

Wreszcie pliki obiektów są niezmienne, więc po ich zapisaniu nigdy nie zmieniają ich zawartości. Jedyną operacją, która ma miejsce, jest przepakowanie, więc nie można uszkodzić pilota przez naciśnięcie, ponieważ nie napisze innej kopii pliku, który już posiada. –

9

Co Linus oznaczało, kiedy powiedział, że Git zapewnia, że ​​pliki nie są uszkodzone, miał na myśli to, że jeśli odnoszą się do konkretnego commit (identyfikowanego przez hash), jesteś gwarantowana że będzie zawsze odnoszą się do dokładnie tego samego stanu repozytorium. Jeśli i wyciągniesz jądro Linuksa z drzewa Linusa, a on odwołuje się do jakiegoś commit ae6bcd1 ..., nie ma nic, co możesz zrobić (nawet w lokalnym repozytorium), aby kiedykolwiek popełnić commit ae6bcd1 ... wyglądać inaczej niż Zauważ, że Linus patrzy, kiedy to mówi.

Co więcej, ponieważ obiekt commit zawiera odniesienia do (wszystkich) jego zatwierdzeń dla rodziców, gdy odwołujesz się do zatwierdzenia, gwarantujesz także jego pełną historię w DAG.

Jeśli chodzi o uszkodzenie plików, jest to rodzaj niezależnego problemu; ale bez uszkodzenia rzeczywistych obiektów typu blob (np. gg/objects/ob/ject_hashname), jeśli jeden z twoich plików drzewa roboczego zostanie uszkodzony, będzie można przywrócić z poprzedniego stanu zatwierdzenia lub ze stanu indeksu/pamięci podręcznej.

W takim przypadku nigdy nie będziesz w stanie uszkodzić pilota, chyba że wykonujesz wymuszone naciśnięcia (które nadpisują historię na pilocie), ponieważ funkcja push zapewnia, że ​​obiekty zatwierdzenia tworzą ciągły wykres historii.

+0

Więc tak szybko, jak tylko spróbuję zepsuć repo, ostrzeże mnie i zawsze będę mógł ponownie sklonować moje powtórzenie i być bezpiecznym. –

6

Ostatnio musiałem zweryfikować repo na serwerze, który rozbił użyłem następującego polecenia:

for gitdir in $(sudo find/-name ".git" -type d -printf "%h "); do 
    cd $gitdir && (git fsck && echo "${gitdir} - "'HAPPY !') \ 
    || echo "${gitdir} - "'ERROR !'; 
done 
Powiązane problemy