2010-07-27 20 views
7

Potrzebuję czegoś podobnego do submodułów, ale które istnieją poza głównym repozytorium jako zależność.Jak dodać repozytorium git jako współdzieloną zależność innego repozytorium git?

Oto problem:

Próbuję użyć Git (w bardzo niewygodnej sposób) do zarządzania plikami projektu dla narzędzia CAD (CadSoft Eagle) i mam problemy ze zorientowaniem jeśli istnieje sposób użycia podmodułów git do zarządzania zależnością każdego projektu od udostępnionej biblioteki narzędzia CAD.

Używam strukturę folderów tak:

~/eagle/ <-- Main library used by multiple projects 
    .git/  
    <library files> 

~/projects/ <-- Projects folder 
    Proj0/ 
     .git/ 
     <design files> 
    Proj1/ 
     .git/ 
     <design files> 

W tym przypadku, to nie ma sensu, aby dodać repozytorium eagle.git jako modułem git dla każdego projektu.

Jednak nadal potrzebuję sposobu, aby zignorować bieżący stan repozytorium "eagle.git", tak aby biblioteka była aktualizowana w przyszłości, może być wycofana, aby uzyskać dostęp do konkretnej wersji plików biblioteki, która były używane, gdy Proj [x] został popełniony.

Idealnie, chciałbym coś jak następuje:

~/eagle/ <-- Main library used by multiple projects 
    .git/  
    <library files> 

~/projects/ <-- Projects folder 
    Proj0/ 
     .git/ 
     <design files> 
     **eagle** <-- something that acts like a submodule 
         but which actually points to ~/eagle/ 
    Proj1/ 
     .git/ 
     <design files> 
     **eagle** <-- something that acts like a submodule 
         but which actually points to ~/eagle/ 

Chciałbym umieć:

cd ~/projects/Proj0 
git submodule update 

i mieć ~/Eagle/katalog automatycznie przywrócić weryfikacja została sprawdzona w Proj0.

Ktoś wie o wszystkim w Git, który mógłby pozwolić na takie zachowanie?

+0

Czy możesz wyjaśnić, dlaczego submodules nie będzie działał tutaj? Brzmi dla mnie jak submoduły są dokładnie tym, czego potrzebujesz. –

+0

Aby narzędzie CAD (Eagle) mogło "zobaczyć" bibliotekę, należy ją dodać do ustawień ścieżki Eagle. Gdybym dodał repozytorium biblioteki "orzeł" jako moduł podmoduł dla każdego projektu, musiałbym ręcznie dołączyć do każdego modułu projektu moduł ścieżki ścieżki Eagle, co spowodowałoby pojawienie się [x] kopii biblioteki "Eagle" w Eagle's menedżer biblioteki. Ustalenie, co jest czym, i zarządzanie tymi oddzielnymi kopiami w narzędziu CAD byłoby koszmarem. Ponadto biblioteka może być o rząd wielkości większa niż pliki projektu, więc wydaje się naprawdę nieekonomiczna, aby mieć [x] jej kopie znajdujące się na dysku. – cdwilson

+0

Pomocny sposób myślenia o tym jest przez analogię. Powiedzmy, że narzędzie Eagle CAD to fabryka, która może tworzyć jeden widget na raz. Powiedzmy, że każdy projekt [x] .git repo jest reprezentowany przez projekt fabryczny [x] dla jakiegoś widżetu [x] produkowanego przez fabrykę. Regeneracja eagle.git jest reprezentowana przez ustawienia fabryczne (maszyny, pracownicy, surowce) wymagane do utworzenia tego widgetu [x]. – cdwilson

Odpowiedz

4

Dla każdego projektu, dodać .git/haki/pre-commit (i upewnić się, że plik wykonywalny):

#!/bin/sh 
git --git-dir=~/eagle/.git log -1 --pretty=format:%H >.eagle_rev 
git add .eagle_rev 

Następnie dla każdego projektu:

git config alias.update-eagle '!git --git-dir=~/eagle/.git --work-tree=~/eagle checkout -q $(<.eagle_rev)' 

Po dokonaniu commit , zapisze bieżącą HEAD ~/eagle, a git update-eagle sprawdzi to zatwierdzenie w ~/eagle. (W takim razie upewnij się, że przed wprowadzeniem w nim zmian jest git checkout <branch> w ~/eagle.)

+0

mkarasek, jesteś nową gorączką! Do tej pory nie miałem pojęcia o hakach ... Jednak z jakiegoś powodu użycie "~" w ścieżce -git-dir zwróciło błąd "fatal: Not a git repository: '~/eagle/.git'". Jeśli jednak zastąpię "~" przez "$ HOME" (tj. "--git-dir = $ HOME/eagle/.git"), to działa dobrze. Każdy pomysł, dlaczego "~" nie działa z --git-dir i --work-tree? – cdwilson

+0

Otrzymujesz ten błąd z hakiem commit? Możliwe, że twój/bin/sh ma problemy z tym; zamień pierwszą linię na #!/bin/bash i zobacz, czy to rozwiąże problem. (Jeśli, z drugiej strony, otrzymujesz ten błąd za pomocą aliasu, to nie mam pojęcia.) – mkarasek

0

Jeśli eagle nie ma swoje miejsce w obrębie ProjX,
aleProjX każdy może użyć konkretnej rewizji eagle,
następnie:

Dla każdego ProjX, trzeba:

  • ma MainProjX Git repo, w którym można znaleźć:
    • ProjX
    • wersja eagle (na samym poziomie niż ProjX)

Celem każdego projektu MainProjX dominującej jest utrzymywanie razem wersje ProjX i eagle , czyli rejestrowanie właściwych zależności.

~/projects/ <-- Projects folder 
    MainProj0 
     Proj0/ 
      .git/ 
      <design files> 
     eagle/ 
      .git/ 
      <library files> 

    MainProj1 
     Proj1/ 
      .git/ 
      <design files> 
     eagle/ 
      .git/ 
      <library files> 

Teraz, tak, że jest wiele „eagle” powielania, ale jest to konieczne, jeśli każdy ProjX jest w stanie wykorzystać swój eagle rewizji.

+0

VonC, dzięki za szybką odpowiedź. Tak, to było jedyne, co mogłem wymyślić ... Problem polega na tym, że repozytorium "orzeł" może być naprawdę masywne (cała biblioteka cad), podczas gdy repozytorium Proj [x] jest naprawdę małe. Tak jak powiedziałeś, musiałbym przechowywać mnóstwo kopii repozytorium "Orzeł", a co gorsza, musiałbym ręcznie zmienić ścieżkę biblioteki narzędzia CAD do indywidualnego Proj [x]/eagle/dir dla narzędzie, aby je zobaczyć, co czyni tę metodę praktycznie bezużyteczną. – cdwilson

+1

@lotharsmash: czy ścieżka względna "' ../ eagle' "nie byłaby wystarczająca dla każdej ścieżki biblioteki? (ponieważ 'orzeł' będzie na tym samym poziomie co' ProjX') – VonC

Powiązane problemy