2010-02-01 7 views
14

Pracuję z repozytorium SVN, które ma ponad 3 lata, zawiera ponad 6 100 zatwierdzeń i ma ponad 1,5 GB. Chcę zmniejszyć rozmiar repozytorium SVN (nie mówię o rozmiarze pełnego eksportu SVN - mam na myśli pełne repozytorium, jakie istniałoby na serwerze) przed przeniesieniem go na nowy serwer.Jak rozpoznać i potencjalnie usunąć duże binarne zatwierdzenia w repozytorium SVN?

Obecny repozytorium zawiera kod źródłowy dla wszystkich naszych projektów oprogramowania, ale również zawiera stosunkowo duże pliki binarne bez znaczenia takie jak:

  • Pełne instalatorów dla wielu 3rd narzędzi firm.
  • .jpg & .png (które są niezmodyfikowanym eksportem plików PSD, które znajdują się w tym samym folderze).
  • Foldery Bin i Obj (które następnie są ignorowane przez "svn").
  • Katalogi Resharper.

Wiele z tych dużych plików zostało "usuniętych SVN" od czasu ich dodania, co stanowi kolejny problem z identyfikacją największych sprawców.

chcę albo:

  • Tworzenie nowego repozytorium SVN, który zawiera tylko kod dla wszystkich projektów oprogramowania - to naprawdę ważne że skopiowane pliki utrzymać swoją historię SVN od starego repozytorium .
  • Usuń duże binarne zatwierdzenia i pliki z istniejącego repozytorium.

Czy jedno z nich jest możliwe?

+1

Nadejdzie dzień, kiedy żałuję tego. Ale Otherside ma rację co do "svnadmin dump", jeśli tak czy owak. –

+2

Dlaczego miałbym żałować tego (szczere pytanie - zamiast rzucać wyzwanie!)? Po prostu próbuję pozbyć się zawartości zawartej w SVN, która może być przechowywana gdzie indziej (co zrobię) lub wcale nie musi być przechowywana. O ile widzę to teraz, jedynym żalem byłbym, gdyby svnadmin dump i svndumpfilter zepsuły historię repozytorium i jego jedyne zidentyfikowane po wielu wielu zobowiązaniach. Czy myślisz, że prawdopodobna jest historyczna korupcja? – InvertedAcceleration

Odpowiedz

4

Będziesz musiał użyć svnadmin dump, aby uzyskać plik zrzutu bieżącego repozytorium i ewentualnie svndumpfilter do przetworzenia pliku zrzutu. Możesz także ręcznie zmodyfikować plik dumpfile, o ile jesteś ostrożny.

To prawdopodobnie nie będzie szybka i łatwa praca, ale można to zrobić. Zrobiłem coś podobnego, tylko dla znacznie mniejszego repozytorium. Miałem repozytorium z około 150 wersjami, które zajęły około 600 MB.

Wykonaj zrzut z bieżącego repozytorium, wprowadź niezbędne zmiany i spróbuj załadować zmodyfikowany plik dumpfile do nowego repozytorium. Następnie sprawdź nowe repozytorium, aby upewnić się, że wszystko jest nadal sensowne (historia nadal jest poprawna, nie ma dziwnych zmian w ścieżkach, ...).

0

Czy to nie jest inny problem, z dodatkowym krokiem? To znaczy. musisz zlokalizować pliki, które uważasz za duże i binarne, a następnie sprawdzić, czy rzeczywiście są zarządzane przez SVN lub zostały zbudowane lokalnie (lub zaimportowane z równoległego systemu zasobów, jeśli jest już na miejscu).

Po prostu znajdź pliki, a następnie wykonaj je na svn info, aby dowiedzieć się, czy są one częścią repozytorium.

+0

Repozytorium SVN działa od ponad 3 lat iw tym czasie duży procent plików, do których się odwołuję, został "usunięty z SVN". Jest też problem z dużych plików binarnych, które były w ruchu podczas rozwoju (jak duże PSD), które od tego czasu zestalone i nie będzie już zmian - więc nie może wynosić 20 MB delt całej Różnie zobowiązuje do takiego pliku (co ja” m nie wiem, jak znaleźć). – InvertedAcceleration

+0

Zasadniczo zaktualizowałem pytanie na podstawie Twojej odpowiedzi, aby upewnić się, że prawidłowo przekazuję tę sytuację. Mam nadzieję, że pomoże to wyjaśnić pewną liczbę punktów. Dzięki za wstępną odpowiedź. – InvertedAcceleration

1

Usunięcie plików z repozytorium za pomocą "Usunięcia SVN" nie spowodowało usunięcia plików. To byłoby piękno SVN. Gdy plik zostanie dodany do repozytorium, będzie tam na zawsze (chyba że użyjesz obciążenia zrzutu &). Po "usunięciu" plików, faktycznie tworzysz nową wersję, która oznacza usunięcie, ale pliki nadal istnieją w poprzednich wersjach.

Zrobiłem kilka zrzutów & obciążenia, ale do dużo większego repozytorium. Około 60 000 (!!!) rewizji. Trwało to długo, ale na końcu, po dokładnym załadowaniu, ponownie zbudowano repozytorium.

Jedynym sposobem jest wyświetlenie wersji dodanych, zmodyfikowanych i usuniętych plików. Następnie zrzuć poprawki pomiędzy i załaduj je we właściwej kolejności. BĄDŹ ŚWIADOMA, nie ma miejsca na błędy. Jeśli popełnisz błąd, będziesz musiał zacząć od nowa. Dump & ładuj od początku.

Moja sugestia, jeśli duże pliki stanowią taki problem, rozważ utworzenie nowego repozytorium bez historii. Zachowaj stary do porównania historii i zacznij działać od nowa.

Powodzenia.

0

Tylko mała myśl, mówisz, że obecny stan repozytorium (obecny HEAD) jest dobry, tj. Duże pliki binarne zostały svn usunięte w przeszłości. W związku z tym Twój problem ma wyłącznie rozmiar repozytorium?

Wiem, że powiedziałeś, że chcesz zachować całą historię zatwierdzeń, ale jako opcję możesz zrobić dwa zrzuty, jeden dla całej historii wersji i jeden dla aktualnej wersji HEAD.

Jeśli umieścisz pełny zrzut na dysku DVD, na przykład, będziesz mieć dostępne dane, jeśli kiedykolwiek będziesz tego potrzebował, ale możesz wtedy usunąć całe repozytorium i svn załadować zrzut wersji, pozostawiając małe czyste repozytorium .

możliwe jest również, aby zrzucić z określonej wersji począwszy, a nie tylko na głowie, więc na przykład można zachować ostatnich 3 miesięcy korekt i zrzucić wszystko na starszą DVD ....

8

Otherside ma rację svnadmin dump, itd. coś jak to będzie Ci szorstką wskaźnik do wersjami, który dodał wiele danych do repo i są kandydatami do svndumpfilter:

for r in `svn log -q | grep ^r | cut -d ' ' -f 1 | tr -d r`; do 
    echo "revision $r is " `svn diff -c $r | wc -c` " bytes"; 
done 

można również spróbować coś takiego znaleźć wersje, które dodały pliki z określonym rozszerzeniem (tutaj, .jpg):

svn log -vq | egrep "^r|\.jpg$" | grep -B 1 "\.jpg$" 
1

Jeśli po prostu trzeba znaleźć przestępstwa popełnia i masz dostęp do serwera, na którym repozytorium szukać dużych plików w podkatalogu db/obr repozytorium (zakładając, że używa formatu FSFS).

0

Opracowanie na odpowiedź Otherside, oto co konkretnie pracował dla mnie:

svnadmin create new-repo 
svnadmin dump old-repo | svndumpfilter exclude --pattern '*.exe' '*.jpg' '*.png' | svnadmin load new-repo 

Możesz być w stanie wykluczyć swoje Obj i Bin katalogów dodając je do komendy svndumpfilter - I nie spróbować.

Ponadto program Subversion o nazwie fsfs-stats (nowy w Subversion 1.8, zastąpiony przez 1.9 w wersji svnfsfs stats) może być przydatny do kwantyfikowania typów plików i konkretnych plików, które wypełniają twoje repozytorium.

Może to być przydatne do porównywania repozytoriów potem:

colordiff -u <(svn log -v file:///.../old-repo) <(svn log -v file:///.../new-repo) 
Powiązane problemy