Odziedziczyłem repozytorium git zawierające wiele projektów w oddzielnych katalogach. Chciałbym podzielić repozytorium na nowe indywidualne repozytoria, po jednym dla każdego projektu, a następnie aby repozytorium główne zawierało projekty jako moduły podrzędne. Chciałbym to wszystko zrobić, jeśli to możliwe, zachowując historię wersji poszczególnych projektów.
Mógłbym sklonować repozytorium dla każdego projektu i za każdym razem usunąć wszystkie inne projekty, ale czy istnieje lepszy sposób na uniknięcie sklonowanej historii w każdym nowym repozytorium projektów?
git
git-submodules
haftowane
źródło
źródło
Odpowiedzi:
Możesz użyć
git filter-branch
do przepisania historii projektu. Z dokumentacji:Zrób kilka kopii repozytorium, zrób to dla każdego podkatalogu, który chcesz podzielić, a powinieneś skończyć z tym, czego szukasz.
źródło
--subdirectory-filter
wiele razy. EGgit filter-branch --subdirectory-filter foodir --subdirectory-filter bardir
itp.--subdirectory
Nie będzie zajmować wielu katalogów, ale można je określić wielokrotnie.foodir
w oryginalnym projekcie, nie przepisując jej historii, po prostugit rm -r foodir
powinno wystarczyć (to również usunie kopię z twojego drzewa roboczego; jeśli tego nie chcesz, użyj--cached
). Jeśli chcesz całkowicie usunąć to z historii (odpowiadając również na pytanie @ilius), potrzebujesz czegoś takiegogit filter-branch --index-filter 'git rm -r --cached --ignore-unmatched foodir' -- --all
--index-filter
rozwiązanie jest szybsze niż w przypadku--tree-filter
, ponieważ nie musi on faktycznie pobierać plików, może po prostu bezpośrednio manipulować indeksem.--tree-filter
Może być trochę łatwiej jednak używać, jak można użyć zwykłych operacji filsystem zamiast pracy z operacji manipulacyjnych indeksu.Aby wyeksportować folder jako nowe repozytorium, potrzebujesz:
Otwórz sklonowany folder repozytorium i uruchom to polecenie:
źródło
git subtree
nie jest dostępny jako pakiet Cygwin. Jeśli tego potrzebujesz: stackoverflow.com/a/27116828/2484903Celem git jest to, że historia jest zawarta w każdym zatwierdzeniu przez haszowanie zatwierdzenia rodzica. Możesz "odtworzyć" zatwierdzenia (tak właśnie działa importer svn) do nowego repozytorium i zachowując tylko każdy podprojekt. To jednak zniszczyłoby znaczenie skrótów zatwierdzania. Jeśli nie masz z tym problemu, niech tak będzie.
W przeszłości po prostu go sklonowałem i ruszyłem dalej. To sprawia, że rzeczy są większe, ale miejsce na dysku jest tanie; mój czas jest drogi.
Nie znam też żadnych narzędzi do rozdzielania katalogu. Przypuszczam, że mógłbyś zalogować się git-log do katalogu, aby znaleźć wszystkie zmiany w nim, a następnie odtworzyć zatwierdzenia za pomocą czegoś takiego jak git-fast-export?
źródło