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?

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ń.


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.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.