Szczegółowe rozwiązanie
Zobacz notatkę na końcu tej odpowiedzi (ostatni akapit), aby uzyskać szybką alternatywę dla podmodułów git przy użyciu npm;)
W poniższej odpowiedzi dowiesz się, jak wyodrębnić folder z repozytorium i utworzyć z niego repozytorium git, a następnie dołączyć go jako moduł podrzędny zamiast folderu.
Zainspirowany artykułem Gerga Bayera Przenoszenie plików z jednego repozytorium Git do innego, zachowywanie historii
Na początku mamy coś takiego:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
W kroki mieszkowy, odniosę się to someLib
jak <directory 1>
.
Na koniec będziemy mieli coś takiego:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
Utwórz nowe repozytorium git z folderu w innym repozytorium
Krok 1
Uzyskaj nową kopię repozytorium do podziału.
git clone <git repository A url>
cd <git repository A directory>
Krok 2
Bieżący folder będzie nowym repozytorium, więc usuń bieżący pilot.
git remote rm origin
Krok 3
Wyodrębnij historię żądanego folderu i zatwierdź go
git filter-branch --subdirectory-filter <directory 1> -- --all
Powinieneś teraz mieć repozytorium git z plikami z directory 1
katalogu głównego repozytorium z całą powiązaną historią zatwierdzania.
Krok 4
Stwórz swoje repozytorium online i prześlij swoje nowe repozytorium!
git remote add origin <git repository B url>
git push
Być może będziesz musiał ustawić upstream
gałąź do pierwszego wypchnięcia
git push --set-upstream origin master
Czyste <git repository A>
(opcjonalnie, patrz komentarze)
Chcemy usunąć ślady (pliki i historię zatwierdzeń) <git repository B>
z, <git repository A>
więc historia dla tego folderu jest tylko raz.
Jest to oparte na usuwaniu poufnych danych z github.
Przejdź do nowego folderu i
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
Zastąp <directory 1>
folderem, który chcesz usunąć. -r
zrobi to rekurencyjnie w określonym katalogu :). Teraz push origin/master
z--force
git push origin master --force
Scena bossa (patrz uwaga poniżej)
Utwórz moduł podrzędny z <git repository B>
do<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
Sprawdź, czy wszystko działa zgodnie z oczekiwaniami i push
git push origin master
Uwaga
Po wykonaniu tego wszystkiego zdałem sobie sprawę, że w moim przypadku bardziej odpowiednie jest użycie npm do zarządzania własnymi zależnościami. Możemy określić adresy URL i wersje git, zobacz adresy URL pakietu Package.json jako zależności .
Jeśli zrobisz to w ten sposób, repozytorium chcesz używać jako wymóg musi być moduł npm więc musi zawierać package.json
plik lub dostaniesz ten błąd: Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.
tldr (rozwiązanie alternatywne)
Może być łatwiejsze korzystanie z npm i zarządzanie zależnościami za pomocą adresów URL git :
- Przenieś folder do nowego repozytorium
- uruchomić
npm init
w obu repozytoriach
- uruchom
npm install --save git://github.com/user/project.git#commit-ish
tam, gdzie chcesz zainstalować zależności