2013-03-14 28 views
5

Zobacz także this question.Jak usunąć duże pliki z Mercurial repo

Nie wiedząc, co robię, włączyłem rozszerzenie pliku, zarchiwizowałem plik i wepchnąłem go do pieca. Teraz znam błąd moich sposobów i muszę trwale przywrócić tę zmianę.

Postępowałem zgodnie ze wskazówkami SO na temat; i mogę usuwać pliki lokalne lokalnie, ale nie ma to wpływu na zdalne repo w piecu. Próbowałem otworzyć repo w KilnRepositories na serwerze Kiln i nuking w folderze largefiles (jak również usunąć "largefiles" z pliku require), ale po kilku popycha/ciągnie folder i linia wymagań wraca.

Czy istnieje sposób na trwałe? (Ustawienie wymagane do odczytu tylko nie działa).

Odpowiedz

10

Uwaga: Dotyczy to przynajmniej (dla Windows) TortoiseHg 2.4 (Mercurial 2.2.1) -> 2.7.1 (Mercurial 2.5.2). Nie będę mówić za przyszłe lub starsze wersje.

Po przejrzeniu różnych dostępnych rozszerzeń mercurial, doszedłem do wniosku, że generalnie nie jest możliwa konwersja repozytorium "wstecz" po zatwierdzeniu pliku przy użyciu rozszerzenia largefiles.

Po pierwsze, dwa uzasadnienia, dlaczego nie chcesz mieć dużych plików w grze na twoich repo: one i two.

Po zatwierdzeniu pliku jako pliku dużego, aby go usunąć, wszystkie odniesienia do ścieżki ".hglf" muszą zostać usunięte z repozytorium. A backout nie jest wystarczający, ponieważ jego zawartość commit odniesie się do ścieżki pliku, w tym do folderu ".hglf". Po zobaczeniu tego przez mercurial, napisze on "largefiles" z powrotem do pliku /.hg/requires, a ponowne repozytorium zostanie ponownie zablokowane. Podobnie z hg zapomnij i usuń.

Opcja 1: Jeśli twoje repo jest w izolacji (masz całkowitą kontrolę repo we wszystkich lokalnych i zdalnych lokalizacjach I nikt nie ma rozgałęzień z tego repozytorium), możliwe może być użycie rozszerzenie mq i strip zestaw zmian. Jest to prawdopodobnie jedyna realna opcja, jeśli złapiesz błąd na czas.

Opcja 2: Jeśli changeset wykraczająca (The dużyplik zmian) występuje na zatwierdzenie phase to zanurzenie (lub może być zmuszony do tyłu w zanurzeniu), to może być możliwe do importowania zatwierdzenie do MQ i unapply the changeset pomocą Hg qpop. Jest to lepsze od usuwania, ponieważ zachowuje historię zatwierdzania do przodu z wyodrębnionego zestawu zmian. W rzeczywistości często nie jest to możliwe, ponieważ prawdopodobnie wykonano scalanie i pchanie/wyciąganie z gałęzi publicznych. Jednakże, jeśli wkrótce zostaniesz złapany, mq może zaoferować sposób na odzyskanie repozytorium.

Opcja 3: Jeśli szkodliwy zestaw zmian odwołuje się do jednego i tylko jednego miejsca (oryginalnego zatwierdzenia), a nikt nie próbował wycofać/usunąć/zapomnieć zestawu zmian (tworząc wiele odniesień), możliwe może być użyj hg rebase, aby złożyć pierwszy zestaw zmian dziecka po przestępstwie z nadrzędnym zestawem zmian przestępstwa. W ten sposób ofensywny zestaw zmian staje się nową głowicą, którą można następnie usunąć za pomocą paska mq. Może to działać, gdy nie powiodły się próby importu do mq.

Wariant 4: Jeśli żadna z powyższych prac, można użyć transplant lub graft, aby wyeksportować wszystkie nie wykraczającej Zestawienia zmian w plastry (uważać, aby je wyeksportować w prawidłowej kolejności), a następnie hg aktualizację do pierwszego SANE changeset przed przestępstwem, mq usuń repozytorium wszystkich przyszłych zestawów zmian, a następnie ponownie zastosuj wyeksportowane poprawki w kolejności.

Opcja 5: (Co ostatecznie zrobiłem). Sklonuj repozytorium lokalnie, aby mieć dwie kopie: clone_to_keep, clone_to_destroy. W clone_to_keep, zaktualizuj pierwszy zestaw zmian rozsądnych przed przestępstwem. Mq usunie wszystkie przyszłe zmiany. Połącz ponownie, jeśli pozostawisz wiele głów. W clone_to_destroy zaktualizuj wskazówkę. W Eksploratorze Windows skopiuj wszystko do/clone_to_destroy z wyjątkiem folderów .hg i .hglf do folderu/clone_to_keep. Wewnątrz Żółwia, zatwierdz wszystkie zmiany w clone_to_keep jako pojedynczy zestaw zmian. Zachowaj jedną zdalną instancję clone_to_destroy w stanie tylko do odczytu dla celów historycznych i zniszcz wszystkie pozostałe.

Opcja 6: Opcja jądrowa. Jeśli wszystko inne zawiedzie i jeśli nie zależy Ci na integracji repo z systemami zewnętrznymi (śledzenie błędów, CI itp.), Możesz wykonać wyżej wymienione SO post i użyć rozszerzenia hg convert. Spowoduje to utworzenie nowej kopii zainfekowanego repozytu, usuwając wszelkie odniesienia do obraźliwych zestawów zmian; robi to jednak poprzez iterowanie każdego zestawu zmian w całym repozytorium i zatwierdzanie go jako nowego zestawu zmian. Tworzy to repozytorium, które nie jest kompatybilne z istniejącymi repozytoriami branżowymi - żaden z zestawów identyfikacyjnych zestawu zmian nie zostanie wyrównany. Jeśli nie masz żadnych repozytoriów, ta opcja prawdopodobnie nigdy nie zadziała.

We wszystkich przypadkach musisz zabrać swoją poprawkę i ręcznie ponownie zastosować do każdej odrębnej instancji repozytorium (skopiuj folder repo, klon, niezależnie od preferowanej metody).

W końcu okazuje się, że włączenie dużych plików jest niezwykle kosztownym błędem. Jest czasochłonne i ostatecznie destrukcyjne do naprawienia. Nie polecam zezwalać na przesyłanie dużych plików do repo.

+0

patrz http://stackoverflow.com/a/14453480/492 –

Powiązane problemy