Utrzymuj repozytorium git w innym repozytorium git

125

Oto, co chciałbym:

REPO-A
  /.git
  /otherFiles
  /REPO-B
    /.git
    /moreFiles

Chcę móc przesłać całą zawartość REPO-A do REMOTE-A i tylko REPO-B do REMOTE-B.

Możliwy?

adamyonk
źródło

Odpowiedzi:

105

Wygląda na to, że chcesz użyć modułów podrzędnych Git .

Git rozwiązuje ten problem za pomocą modułów podrzędnych. Moduły podrzędne umożliwiają przechowywanie repozytorium Git jako podkatalogu innego repozytorium Git. Pozwala to na sklonowanie innego repozytorium do projektu i oddzielenie zatwierdzeń.

mipadi
źródło
19
Niezupełnie: nie przesunie całej zawartości repoA: tylko A plus odniesienie do B. Ale nie krytykuję twojej odpowiedzi, spieszyłem się z pisaniem prawie tak samo, kiedy ponownie przeczytałem pytanie OP;)
VonC
1
To prawie przypadek użycia podmodułów. REPO-A i REPO-B są traktowane jako repozytoria git same w sobie, z własnymi zobowiązaniami, pochodzeniem, historią itp.
Damien Wilson
2
więc jeśli dobrze to czytam, czy mogę niezależnie sprawdzić repozytorium submodułu-d całkowicie poza tym, w którym je znajduję? Jak wziąć już istniejące repozytorium i odwołać się do niego jako podmodułu w innym projekcie?
JohnO,
Nie szukałem dokładnie tego samego rozwiązania, co OP i uważam, że średnio jest to prawdopodobnie bardziej poszukiwana odpowiedź na podobne pytanie: „czy umieszczenie git REPO-B w git REPO-A osadza odniesienie lub pełną kopię git REPO-B? ”.
jaya
64

Zawsze używałem linków symbolicznych do utrzymywania dwóch oddzielnych i odrębnych repozytoriów.

JohnO
źródło
8
bo jak zagmatwane wydają się podmoduły git i poddrzewo git, to jest poprawna odpowiedź.
Trevor Hickey
Jest to również bardzo przydatne przy składaniu jednej aplikacji z wielu zdalnych repozytoriów
GeraldScott
22
Aby utrzymać dwa oddzielne i odrębne repozytoria, czy nie byłoby w porządku zatrzymać repozytorium B w repozytorium A i po prostu dodać repozytorium B do repozytorium A .gitignore?
Fabien Snauwaert
1
Myślałem o zrobieniu tego, co sugeruje Fabien, czy jest jakiś problem z zrobieniem tego w ten sposób?
theonlygusti
1
Przechowuję repozytoria git oddzielnie i kopiuję zmiany wprowadzone w REPO-B w kopii REPO-B (bez .git) zagnieżdżonej w REPO-A. Robię to z rsync. Biegnę rsync -avh --delete --exclude='.git' REPO-B/ REPO-A/REPO-B-copy/po zmianach w REPO-B
Shai
29

Tak, możesz zrobić dokładnie to, o co prosisz, z narysowaną hierarchią plików. Repo-B będzie niezależne i nie będzie miało żadnej wiedzy na temat Repo-A. Repo-A śledzi wszystkie zmiany w swoich własnych plikach i plikach Repo-B.

Jednak nie polecałbym tego robić. Za każdym razem, gdy zmieniasz pliki i zatwierdzasz w Repo-B, będziesz musiał zatwierdzić w Repo-A. Rozgałęzianie w Repo-B zadziała z Repo-A, a rozgałęzienie w Repo-A będzie niewygodne (problemy z usuwaniem folderów itp.). Podmoduły są zdecydowanie najlepszym rozwiązaniem.

kubi
źródło
53
Nie możesz po prostu dodać REPO-B do /REPO-A/.gitignore?
mikkelbreum
2
@mikkelbreum Miałem dokładnie ten sam pomysł. Obecnie używamy subverion w naszym głównym projekcie i używamy repozytorium git w jednym z podfolderów. Dzięki SVN właśnie dodałem folder z repozytorium git do właściwości svn: ignore i zadałem sobie pytanie, czy mogę zrobić to samo z git.
2ndkauboy
3
Cóż, nie rozumiem, dlaczego dodanie zagnieżdżonego repozytorium git do listy ignorowanych repozytorium nadrzędnego nie powinno działać .. Ale jednocześnie mam wrażenie, że musi być jakiś haczyk, o którym nie myślałem, ponieważ takie podejście jest rzadko spotykane sugerowane, a wiele osób odradza zagnieżdżone repozytoria git.
mikkelbreum
18
Właśnie wdrożyłem dokładnie ten scenariusz. Mam kilka nieskompresowanych plików CSS w podfolderze, których nie chcę wypychać do zdalnego repozytorium, więc są one w moim .gitignore. Ale chcę lokalnie śledzić zmiany w tych plikach. Skonfigurowałem repozytorium w folderze z nieskompresowanymi plikami i dodałem wszystkie pliki do tego repozytorium. Nadal jest ignorowany przez repozytorium nadrzędne, ale mogę śledzić zmiany w repozytorium podrzędnym. Zalecane lub nie, to rozwiązanie jest kluczowe w pewnych sytuacjach, takich jak ta.
BrianVPS
1
Rozumiem, że za każdym razem, gdy zmienisz gałęzie w jednym repozytorium, w drugim zobaczysz całą masę zmian, ale dlaczego „rozgałęzianie w Repo-A będzie niewygodne (problemy z usuwaniem folderów itp.)”? Dzięki!
user2688151
2

Możesz osiągnąć to, co chcesz (to repozytorium REPO-A zawiera wszystkie pliki, w tym te w folderze REPO-B, a nie tylko odniesienie), używając „git-subrepo”:

https://github.com/ingydotnet/git-subrepo

Nadal działa, jeśli niektórzy z twoich współpracowników nie mają zainstalowanego polecenia subrepo; zobaczą pełną strukturę folderów, ale nie będą w stanie zatwierdzić zmian w repozytoriach.

Klej
źródło