Po pomyślnym przekonwertowaniu repozytorium SVN na Git mam teraz bardzo duże repozytorium Git, które chcę rozbić na wiele mniejszych repozytoriów i zachować historię.
Czy ktoś może więc pomóc w rozbiciu repozytorium, które może wyglądać tak:
MyHugeRepo/
.git/
DIR_A/
DIR_B/
DIR_1/
DIR_2/
Do dwóch repozytoriów, które wyglądają tak:
MyABRepo/
.git
DIR_A/
DIR_B/
My12Repo/
.git
DIR_1/
DIR_2/
Próbowałem postępować zgodnie ze wskazówkami w tym poprzednim pytaniu, ale tak naprawdę nie pasuje, gdy próbuję umieścić wiele katalogów w oddzielnym repozytorium ( podkatalog Odłącz (przenieś) do oddzielnego repozytorium Git ).
Odpowiedzi:
Spowoduje to skonfigurowanie MyABRepo; oczywiście możesz zrobić My12Repo podobnie.
Pozostaje odniesienie do .git / refs / original / refs / heads / master. Możesz to usunąć za pomocą:
Jeśli wszystko poszło dobrze, możesz usunąć MyABRepo.tmp.
Jeśli z jakiegoś powodu pojawi się błąd dotyczący .git-rewrite, możesz spróbować tego:
Spowoduje to utworzenie i użycie /tmp/git-rewrite.tmp jako katalogu tymczasowego zamiast
.git-rewrite
. Oczywiście zamiast tego możesz zastąpić dowolną ścieżkę/tmp/git-rewrite.tmp
, o ile masz uprawnienia do zapisu, a katalog jeszcze nie istnieje.źródło
DIR_A
na przykład)?filter-branch
. Dla tych, którzy nie są tego świadomi, ponownie zapisuje historię, więc jeśli planujesz wypchnąć repozytorium po wykonaniu tej czynności, skróty zatwierdzania będą teraz inne i nie będą działać.Możesz użyć
git filter-branch --index-filter
z,git rm --cached
aby usunąć niechciane katalogi z klonów / kopii oryginalnego repozytorium.Na przykład:
Będziesz musiał ręcznie usunąć niepotrzebne gałęzie lub tagi każdego repozytorium (np. Jeśli miałeś gałąź feature-x-for-AB , prawdopodobnie chcesz ją usunąć z repozytorium „12”).
źródło
:
nie jest znakiem komentarza w bash. Zamiast tego powinieneś użyć#
.:
to tradycyjne polecenie wbudowane ( również określone w POSIX ). Jest zawarty w bash , ale nie jest to komentarz. Użyłem go specjalnie zamiast tego,#
ponieważ nie wszystkie powłoki przyjmują#
jako wprowadzające komentarze we wszystkich kontekstach (np. Interaktywny zsh bez włączonej opcji INTERACTIVE_COMMENTS). Użycie:
sprawia, że cały tekst nadaje się do wklejenia do dowolnej interaktywnej powłoki, a także do zapisania w pliku skryptu.git remote rm origin
, co zawsze wydaje się zwracać 1. Dlatego zastąpiłem&&
przez;
dla tej linii.git remote add origin $TARGET; git push origin master
.Projekt git_split to prosty skrypt, który robi dokładnie to, czego szukasz. https://github.com/vangorra/git_split
Zamień katalogi git w ich własne repozytoria we własnej lokalizacji. Brak zabawnego biznesu w poddrzewie. Ten skrypt weźmie istniejący katalog w repozytorium git i zamieni ten katalog w niezależne repozytorium. Po drodze skopiuje całą historię zmian dla podanego katalogu.
źródło
Oto skrypt ruby, który to zrobi. https://gist.github.com/4341033
źródło
Dziękuję za odpowiedzi, ale skończyło się na dwukrotnym skopiowaniu repozytorium, a następnie usunięciu z każdego plików, których nie chciałem. Zamierzam użyć gałęzi filter w późniejszym terminie, aby usunąć wszystkie zatwierdzenia dla usuniętych plików, ponieważ są one już kontrolowane w innym miejscu.
To działało na to, czego potrzebowałem.
EDYCJA: Oczywiście to samo zostało zrobione w My12Repo w stosunku do katalogu A i B. Dało mi to dwa repozytoria z identyczną historią do momentu, w którym usunąłem niechciane katalogi.
źródło