Podczas zabawy git
, Czasami próbuję różnych rzeczy, a następnie przerywam polecenia, które trwają zbyt długo (np. Niektóre git svn
polecenia zawieszające się podczas problemów z siecią). To sprawiło, że pomyślałem:
Czy zawsze można bezpiecznie wymusić przerwanie polecenia (Ctrl-C lub kill
)? Co się stanie, jeśli polecenie ulegnie awarii (brak pamięci, błąd, problem z siecią / FS)? Czy zmiany w repozytorium są „transakcyjne” w tym sensie, że niekompletne zmiany są „wycofywane” (jak w systemie plików wersji)? Czy w takim przypadku ryzykuję uszkodzenie repozytorium?
Jestem pewien, że inteligentni ludzie pracujący na git musieli to wziąć pod uwagę, ale nie mogłem znaleźć żadnych informacji w instrukcji git ani w Internecie.
Odpowiedzi:
9 dla odpowiedzi № 1Repozytorium jest w pełni transakcyjne, tak.
Drzewo pracy jest prawie transakcyjne, ale istniejeto przypadek narożny, z którym nie można łatwo sobie poradzić. Kasa wykonuje wszystkie niezbędne kontrole i zapisuje nową zawartość do plików tymczasowych, aw tym czasie nic nie jest modyfikowane, jeśli ją przerwiesz. Ale wtedy zmienia nazwę plików na drzewo jeden po drugim i na koniec aktualizuje referencję HEAD, a przerwanie w tej fazie może spowodować częściowe zmiany wprowadzone w drzewie. Nie ma masowej zmiany nazwy, która pozwoliłaby na atomowe wykonanie tej czynności.