Mam aplikację internetową, która eksploruje inne aplikacje internetowe w określony sposób. Zawiera kilka demonstracji internetowych w demos
folderze, a jedno z nich powinno mieć teraz swoje własne repozytorium. Chciałbym utworzyć osobne repozytorium dla tej aplikacji demonstracyjnej i nadać mu rozszerzeniepodpakiet podmoduł z głównego repozytorium bez utraty historii zmian.
Czy można zachować historię zatwierdzeń z plików w folderze repozytorium i utworzyć z niego repozytorium i zamiast tego używać go jako modułu podrzędnego ?
git
git-submodules
revision-history
GabLeRoux
źródło
źródło
Odpowiedzi:
Szczegółowe rozwiązanie
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:
W kroki mieszkowy, odniosę się to
someLib
jak<directory 1>
.Na koniec będziemy mieli coś takiego:
Utwórz nowe repozytorium git z folderu w innym repozytorium
Krok 1
Uzyskaj nową kopię repozytorium do podziału.
Krok 2
Bieżący folder będzie nowym repozytorium, więc usuń bieżący pilot.
Krok 3
Wyodrębnij historię żądanego folderu i zatwierdź go
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!
Być może będziesz musiał ustawić
upstream
gałąź do pierwszego wypchnięciaCzyste
<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
Zastąp
<directory 1>
folderem, który chcesz usunąć.-r
zrobi to rekurencyjnie w określonym katalogu :). Teraz pushorigin/master
z--force
Scena bossa (patrz uwaga poniżej)
Utwórz moduł podrzędny z
<git repository B>
do<git repository A>
Sprawdź, czy wszystko działa zgodnie z oczekiwaniami i
push
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 :
npm init
w obu repozytoriachnpm install --save git://github.com/user/project.git#commit-ish
tam, gdzie chcesz zainstalować zależnościźródło
cd someLib
przed krokiem 2? Mówisz „Bieżący folder będzie nowym repozytorium”, ale tak naprawdę nie będzie; nowe repozytorium (moduł podrzędny) znajduje się w tym folderze.refs/original/...
który jest tworzony w kroku 3.Rozwiązanie @GabLeRoux zgniata gałęzie i związane z nimi zatwierdzenia.
Prosty sposób na sklonowanie i zachowanie tych wszystkich dodatkowych gałęzi i zatwierdzeń:
1 - Upewnij się, że masz ten alias git
2 - Sklonuj pilota, ściągnij wszystkie gałęzie, zmień pilota, przefiltruj katalog, wciśnij
źródło
Rozwiązanie GabLeRoux działa dobrze, chyba że używasz
git lfs
i masz duże pliki w katalogu, który chcesz odłączyć. W takim przypadku po kroku 3 wszystkie duże pliki pozostaną plikami wskaźników zamiast prawdziwymi plikami. Myślę, że jest to prawdopodobnie spowodowane usunięciem.gitattributes
pliku w procesie gałęzi filtru.Zdając sobie z tego sprawę, stwierdzam, że działa dla mnie następujące rozwiązanie:
Kopiowanie,
.gitattributes
które git lfs używa do śledzenia dużych plików do.git/
katalogu, aby uniknąć ich usunięcia.Kiedy filter-branch jest gotowy, nie zapomnij wstawić z powrotem,
.gitattributes
jeśli nadal chcesz używać git lfs dla nowego repozytorium:źródło