2010-04-21 12 views
51

Czy istnieje sposób usuwania rtęci w celu usunięcia starych zestawów danych z bazy danych? Mam repozytorium o pojemności 60 GB, co sprawia, że ​​wykonanie klona jest dość bolesne. Chciałbym odciąć wszystko przed pewną datą i odłożyć ogromną bazę danych, żeby zbierać kurz.Usunięcie historii rtęci

+0

Jakie pliki są duże? – tonfa

+1

Jak to się zaczęło? – Santa

+12

Jeśli Jake ma jakieś pliki binarne (które są czasami niezbędne ... nie wszystkie pliki binarne są generowane przez źródło), to każda niewielka zmiana w tym pliku powoduje, że nowa kopia zostanie wykonana w repozytorium. W zależności od rozmiaru pliku lub częstotliwości zmian coś takiego jak 60 GB może nie potrwać zbyt długo. – bobpaul

Odpowiedz

27

Możesz to zrobić, ale w ten sposób unieważniasz wszystkie klony, więc generalnie nie jest to rozsądne, chyba że pracujesz całkowicie sam.

Każdy zestaw zmian w merkurialnie jest jednoznacznie identyfikowany hashcode, który jest kombinacją (między innymi) zmian w kodzie źródłowym, metadanych i skrótów jednego lub dwóch rodziców. Ci rodzice muszą istnieć w repozytorium aż do samego początku projektu. (Brak restrykcji będzie miał płytkie klony, które nie są jeszcze dostępne).

Jeśli nie masz nic przeciwko zmianie skrótów nowszych zestawów zmian (które ponownie rozbijają wszystkie klony na wolności), możesz to zrobić za pomocą poleceń;

hg export -o 'changeset-%R.patch' 400:tip # changesets 400 through the end for example 
cd /elsewhere 
hg init newrepo 
cd newrepo 
hg import /path/to/the/patches/*.patch 

Prawdopodobnie będziesz musiał wykonać trochę pracy, aby poradzić sobie z zestawieniami scalania, ale to jest ogólny pomysł.

Można by też zrobić to za pomocą hg convert z rodzaju hg zarówno jako źródła i rodzaju przeznaczenia oraz przy użyciu splicemap, ale to chyba jeszcze bardziej zaangażować.

Największe pytanie brzmi: w jaki sposób wpisujesz 60 GB kodu źródłowego lub czy dodałeś wygenerowane pliki do wszystkich porad. :)

+0

Znacznie bardziej szczegółowa odpowiedź niż moja (usunięta) odpowiedź. +1 – VonC

+0

Importuję z innego systemu kontroli źródła projekt zawierający wygenerowane pliki binarne. Próbujemy teraz usunąć biblioteki DLL z kontroli źródła. Dzięki za pomoc! –

+2

Odpowiedź zawiera literówkę. Nazwa pliku powinna zawierać małe litery% r (liczby zerowe), w przeciwnym razie pliki nie zostaną przetworzone we właściwej kolejności podczas importowania. – Gili

44

Nie ma prostego/zalecanego sposobu zrobienia tego bezpośrednio do istniejącego repozytorium.

Można jednak „przerobić” swoje rtęciowego repo do nowego mercurial repo i wybrać wersję z którym obejmuje historię począwszy poprzez opcję convert.hg.startrev

hg convert --config convert.hg.startrev=1234 <source-repository> <new-repository-name> 

Nowy repo będzie zawierać wszystko z oryginalnego repo minus historia poprzednia do wersji początkowej.

Zastrzeżenie: Nowy repo będzie miała zupełnie nowe identyfikatory changeset, to znaczy, że nie jest w żaden sposób powiązany z oryginalnym repo. Po stworzeniu nowego repo, każdy programista musi sklonować nowe repozytorium i usunąć swoje klony z oryginalnego repo.

Użyłem tego do oczyszczenia starych repo używanych wewnętrznie w naszej firmie - w połączeniu z opcją --filemap do usuwania niechcianych plików.

+0

Więc w jaki sposób to rozwiązanie różni się od usuwania katalogu .hg/i wykonywania hg w tym? – grzaks

+0

Niestety, nie rozumiem Twojego komentarza. Co ma do zrobienia lokalny katalog .hg i init hg z usuwaniem zestawów zmian z repozytorium? –

+4

@Gaks, twoje podejście niszczy całe repozytorium i tworzy nowe, podejście Gerda selektywnie niszczy repozytorium z pewnej wersji z powrotem. Oba podejścia są przydatne w zależności od okoliczności. Podejście Gerda przydaje mi się właśnie teraz, gdy zamierzam opublikować prywatne repozytorium i chcę zachować rewizje z zeszłego miesiąca, ale nic przed tym. – lsh