Jak pracować z repozytorium git w innym repozytorium?

284

Mam repozytorium multimediów Git, w którym przechowuję wszystkie moje główne pliki JavaScript i CSS oraz skrypty, których będę używać w różnych projektach.

Jeśli utworzę nowy projekt, który znajduje się we własnym repozytorium Git, jak korzystać z plików JavaScript z mojego repozytorium multimediów w nowym projekcie w sposób, który sprawia, że ​​nie muszę aktualizować obu kopii skryptu podczas wprowadzania zmian ?

Brent O'Connor
źródło
Proszę zobaczyć odpowiedź w poddrzewie poniżej z @ ruslan-kabalin. Uwaga: haczyki poprzedzające zatwierdzenie (lub nadmierne zaangażowanie ) są jednym ze sposobów na rozwiązanie sprzeciwu zgłoszonego przez Roberta Dundona
Jeż

Odpowiedzi:

348

Kluczem są submoduły git .

Zacznij czytać rozdział Submodules w Git Community Book lub Podręczniku użytkownika

Załóżmy, że masz repozytorium PROJECT1, PROJECT2 i MEDIA ...

cd /path/to/PROJECT1
git submodule add ssh://path.to.repo/MEDIA
git commit -m "Added Media submodule"

Powtórz na drugim repo ...

Fajne jest to, że za każdym razem, gdy zatwierdzasz zmiany w MEDIA, możesz to zrobić:

cd /path/to/PROJECT2/MEDIA
git pull
cd ..
git add MEDIA
git commit -m "Upgraded media to version XYZ"

Właśnie to zarejestrowało fakt, że submoduł MEDIA WITHIN PROJECT2 jest teraz w wersji XYZ.

Daje to 100% kontroli nad tym, jakiej wersji MEDIA używa każdy projekt. podmoduły git są świetne, ale musisz eksperymentować i dowiedzieć się o nich.

Z wielką mocą przychodzi wielka szansa na ugryzienie w kupę.

gahooa
źródło
Ten przepływ pracy przypomina mi korzystanie z prywatnego modułu NPM stackoverflow.com/questions/7575627/…
cyrf
Jeśli wolisz, aby domyślna była najnowsza wersja, możesz dodać skrypt propagujący zatwierdzenie MEDIA do wszystkich zależnych projektów.
jiggunjer
3
Jak to się integruje z githubem?
theonlygusti
27

Zastanów się nad użyciem poddrzewa zamiast submodułów, dzięki czemu użytkownicy repozytorium będą znacznie łatwiejsi. Bardziej szczegółowy przewodnik można znaleźć w książce Pro Git .

Ruslan Kabalin
źródło
6
Oto kolejny artykuł informacyjny o poddrzewie vs. submoduł: blogs.atlassian.com/2013/05/…
Benny Neugebauer
3
Według tego artykułu jedną z wad jest:> Odpowiedzialność za nie mieszanie kodu super i podprojektu w commits spoczywa na tobie. Nikt nie miał na to czasu (IMO)
Robert Dundon
20

Jeśli dobrze rozumiem twój problem, potrzebujesz następujących rzeczy:

  1. Przechowuj swoje pliki multimedialne w jednym repozytorium git, z którego korzysta wiele projektów
  2. Jeśli zmodyfikujesz plik multimedialny w dowolnym projekcie na komputerze lokalnym, powinien on natychmiast pojawić się w każdym innym projekcie (więc nie chcesz przez cały czas zatwierdzać + wypychać + wyciągać)

Niestety nie ma ostatecznego rozwiązania tego, czego chcesz, ale istnieją pewne rzeczy, dzięki którym możesz ułatwić sobie życie.

Najpierw powinieneś zdecydować o jednej ważnej rzeczy: czy chcesz przechowywać dla każdej wersji w repozytorium projektu odniesienie do wersji plików multimedialnych? Na przykład, jeśli masz projekt o nazwie example.com, czy potrzebujesz wiedzieć, którego style.css używał 2 tygodnie temu, czy najnowszy jest zawsze (lub głównie) najlepszy?

Jeśli nie musisz tego wiedzieć, rozwiązanie jest proste:

  1. utwórz repozytorium dla plików multimedialnych i jedno dla każdego projektu
  2. utwórz symboliczne łącze w swoich projektach, które wskazują na lokalnie sklonowane repozytorium mediów. Możesz albo utworzyć względne dowiązanie symboliczne (np. ../Media) i założyć, że każdy przejdzie do projektu, aby katalog multimediów znajdował się w tym samym miejscu, lub wpisać nazwę dowiązania symbolicznego do .gitignore i każdy może zdecydować gdzie umieszcza pliki multimedialne.

W większości przypadków jednak chcesz poznać te informacje o wersji. W takim przypadku masz dwie możliwości:

  1. Przechowuj każdy projekt w jednym dużym repozytorium. Zaletą tego rozwiązania jest to, że będziesz mieć tylko 1 kopię repozytorium multimediów. Dużą wadą jest to, że znacznie trudniej jest przełączać się między wersjami projektu (jeśli przejdziesz do innej wersji, zawsze zmodyfikujesz WSZYSTKIE projekty)

  2. Użyj submodułów (jak wyjaśniono w odpowiedzi 1). W ten sposób będziesz przechowywać pliki multimedialne w jednym repozytorium, a projekty będą zawierać tylko odniesienie do konkretnej wersji repozytorium multimediów. Ale w ten sposób zwykle będziesz mieć wiele lokalnych kopii repozytorium multimediów i nie będziesz mógł łatwo modyfikować pliku multimedialnego we wszystkich projektach.

Gdybym był tobą, prawdopodobnie wybrałbym pierwsze lub trzecie rozwiązanie (dowiązania symboliczne lub submoduły). Jeśli zdecydujesz się na użycie podmodułów, nadal możesz zrobić wiele rzeczy, aby ułatwić Ci życie:

  1. Przed zatwierdzeniem możesz zmienić nazwę katalogu submodułu i umieścić dowiązanie symboliczne do wspólnego katalogu multimediów. Kiedy będziesz gotowy do zatwierdzenia, możesz usunąć dowiązanie symboliczne i usunąć submoduł z powrotem, a następnie zatwierdzić.

  2. Możesz dodać jedną ze swoich kopii repozytorium multimediów jako repozytorium zdalne do wszystkich swoich projektów.

Możesz dodać katalogi lokalne jako zdalne w ten sposób:

cd /my/project2/media
git remote add project1 /my/project1/media

Jeśli zmodyfikujesz plik w / my / project1 / media, możesz zatwierdzić go i pobrać z / my / project2 / media bez wypychania go na zdalny serwer:

cd /my/project1/media
git commit -a -m "message"
cd /my/project2/media
git pull project1 master

Możesz później usunąć te zatwierdzenia (z git reset), ponieważ nie udostępniłeś ich innym użytkownikom.

Gyim
źródło
1
w przypadku projektów związanych z siecią, w których pracujesz z wwwfolderu Apache , powinieneś umieścić .htaccessplik w katalogu głównym wwwfolderu lub projektu, Options +FollowSymLinksw nim, lub jeszcze lepiej <IfModule mod_rewrite.c>{new line}Options +FollowSymLinks{new line}RewriteEngine on{new line}</IfModule> (zamień na {new line}nowy wiersz)
3

Miałem problemy z poddrzewami i podmodułami, które sugerują inne odpowiedzi ... głównie dlatego, że używam SourceTree i wydaje się, że jest dość wadliwy.

Zamiast tego skończyłem używać SymLinks i wydaje się, że działa dobrze, więc zamieszczam to tutaj jako możliwą alternatywę.

Kompletny przewodnik tutaj: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

Ale w zasadzie musisz po prostu połączyć obie ścieżki w wierszu polecenia z podwyższonym poziomem uprawnień. Upewnij się, że używasz prefiksu twardego łącza / J. Coś w tym stylu: mklink / JC: \ projects \ MainProject \ plugins C: \ projects \ SomePlugin

Możesz także użyć względnych ścieżek folderów i umieścić je w nietoperzu, aby każda osoba wykonała je po raz pierwszy podczas sprawdzania projektu.

Przykład: mklink / J. \ Assets \ TaqtileTools .. \ TaqtileHoloTools

Po połączeniu folderu może być konieczne zignorowanie folderu w głównym repozytorium, do którego się on odnosi. W przeciwnym razie możesz iść.

Uwaga : Usunąłem duplikat odpowiedzi z innego postu, ponieważ ten post został oznaczony jako duplikat tego pytania.

ickydime
źródło