2009-11-28 24 views
224

Mam repozytorium multimediów Git, w którym przechowuję wszystkie moje pliki główne i skrypty JavaScript i CSS, które będę używać w różnych projektach.Jak pracować z repozytorium git w innym repozytorium?

Jeśli utworzę nowy projekt, który znajduje się we własnym repozytorium Git, w jaki sposób mogę używać plików JavaScript z mojego repozytorium multimediów w moim nowym projekcie w sposób, który sprawia, że ​​nie muszę aktualizować obu kopii skryptu kiedy wprowadzam zmiany?

Odpowiedz

295

Dobre pytanie. Kluczem jest git submodules.

zacząć czytać rozdział submodułów z Git Community Book lub ochrony Users Manual

Say masz repozytorium project1, PROJECT2 i mediów ...

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

Powtórz po drugiej repo ...

teraz, fajne jest to, że za każdym razem gdy dokonać zmian do mediów, można to zrobić:

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

To właśnie odnotowało fakt, że moduł podrzędny MEDIA WITHIN PROJECT2 znajduje się teraz w wersji XYZ.

Daje to 100% kontroli nad wersją programu MEDIA, z której korzysta każdy projekt. git submoduły są świetne, ale trzeba poeksperymentować i dowiedzieć się o nich.

Z wielką mocą daje wielką szansę na ukąszenie w zad.

+0

Ten przebieg przypomina mi użycie prywatnego modułu NPM http://stackoverflow.com/questions/7575627/can-you-host-a-private-repository-for-your-organization-to-use- with- npm # answer-7807279 – cyrf

+0

Jeśli wolisz, aby domyślna była najnowsza wersja, możesz dodać skrypt, aby propagować zatwierdzenie MEDIA do wszystkich zależnych projektów. – jiggunjer

+2

Jak to się integruje z githubem? – theonlygusti

19

Jeśli rozumiem problemu dobrze chcesz następujące rzeczy:

  1. miec pliki multimedialne przechowywane w jednym repozytorium pojedynczego git, który jest używany przez wiele projektów
  2. Jeśli modyfikować plik multimedialny w dowolnym projekcie na lokalnym komputerze powinien on natychmiast pojawić się w każdym innym projekcie (nie chcesz więc zatwierdzać + push + ciągnij cały czas)

Niestety, nie ma ostatecznego rozwiązania dla czego chcesz, ale są 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óry styl.css był używany 2 tygodnie temu, czy najnowszy jest zawsze (lub w większości) najlepszy?

Jeśli nie wiedzieć, że rozwiązanie jest proste:

  1. stworzyć repozytorium plików multimedialnych i jeden dla każdego projektu
  2. utworzyć dowiązanie symboliczne w projektach, które wskazują na lokalnie sklonowane repozytorium multimediów. Możesz albo utworzyć względne dowiązanie symboliczne (np. ../media) i założyć, że wszyscy skończą projekt, aby katalog z multimediami był w tym samym miejscu, lub zapisz nazwę dowiązania symbolicznego w .gitignore, i każdy może zdecydować gdzie umieszcza pliki multimedialne.

W większości przypadków jednak chcesz poznać informacje o tej 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 zamawiasz do innej wersji, będziesz zawsze modyfikował 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ły tylko odniesienie do konkretnej wersji repozytorium mediów. W ten sposób zwykle będziesz mieć wiele lokalnych kopii repozytorium multimediów i nie będziesz mógł łatwo zmodyfikować pliku multimedialnego we wszystkich projektach.

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

  1. Przed podjęciem można zmienić nazwę katalogu submodule i umieścić dowiązania do wspólnego katalogu mediów. Kiedy będziesz gotowy do zatwierdzenia, możesz usunąć dowiązanie symboliczne i wycofać moduł częściowy, a następnie zatwierdzić.

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

Możesz dodać lokalnych katalogów jako pilota w ten sposób:

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

Jeśli modyfikować plik w/mojego/project1/media, można popełnić go i wyciągnąć go z/mojego/project2/mediów bez pchania go do zdalnego serwera:

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

Jesteś wolny, aby usunąć te rewizje później (z resetem git), ponieważ nie podzielił się nimi z innymi użytkownikami.

+1

w przypadku projektów internetowych, w których pracujesz z folderu 'www' Apache, powinieneś umieścić plik' .htaccess' w katalogu głównym folderu 'www' lub projektu, z opcjami' Options + FollowSymLinks' lub lepiej jeszcze ' {nowa linia} Opcje + FollowSymLinks {nowa linia} RewriteEngine na {nowa linia}' (zamień '{nowa linia}' na aktualną nową linię') –

22

Zastanów się nad użyciem podtytułów subtree, ułatwi to życie użytkownikom repo. Bardziej szczegółowy przewodnik można znaleźć pod adresem Pro Git book.

+6

Oto kolejny artykuł informujący o poddrzewie kontra submodule: http://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree/ –

+0

W tym artykule, jedną z wad jest: > Odpowiedzialność za nie mieszanie super i sub - Kod projektu w commits spoczywa na Tobie. Nikt nie ma na to czasu (IMO) –

2

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

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

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

Ale w zasadzie wystarczy mklink dwie ścieżki w podwyższonej wierszu poleceń. Upewnij się, że używasz prefiksu twardego linku/J. Coś w tym stylu: mklink/JC: \ projects \ MainProject \ plugins C: \ projects \ SomePlugin

Możesz także użyć względnych ścieżek do folderów i umieścić je w kija do wykonania przez każdą osobę, gdy po raz pierwszy sprawdzą twoje projekt.

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

Po połączeniu folderu może być konieczne zignorowanie folderu w głównym repozytorium, które się do niego odwołuje. W przeciwnym razie jesteś dobry.

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