2011-12-30 19 views
7

Jest to pytanie, które wydaje się pojawiać pół-często, ale niestety nie znalazłem odpowiedzi, którą mogę w pełni zastosować do mojej sytuacji, więc pomyślałem, że zadam własne pytanie . To jest moje pierwsze pytanie na SO, więc bądź miły. : PWiele repozytoriów w jednym katalogu

„Problem”: Nasza firma rozwija się wiele aplikacji PHP, jednak jedna z tych aplikacji jest „master” rodzajów. Wszystkie nasze inne aplikacje są zainstalowane wewnątrz tej "aplikacji master" i wymagają działania głównej aplikacji.

Oczywiście używamy kontroli wersji do zarządzania tymi aplikacjami.

Podczas gdy wiele plików w naszych aplikacjach dodatków znajduje się w podkatalogach, nie wszystkie z nich są. Oznacza to, że nie możemy używać importowania podkatalogów (svn externals, git submoduły itp.). Na przykład w folderze głównym znajduje się kilka folderów (admin, public, kernel itd.), A aplikacje addon mają pliki w jednym lub więcej z tych folderów - nie są one niezależnie samodzielne w strukturze katalogów aplikacji głównej .

Obecnie korzystamy z SVN i niedawno znaleźliśmy się z myślą o git z powodu niektórych dostępnych funkcji, które mogą nam się przydać. Jedną rzeczą, której nie jestem pewien z git, jest to, czy naprawdę istnieje sposób "scalenia" (nie w sensie kontroli wersji) tych repozytoriów w jeden katalog lokalnie, gdy programiści pracują nad kodem. Nie znalazłem sposobu, aby to zrobić z SVN.

W idealnym świecie, mielibyśmy jedno repozytorium dla naszego "mistrza" wniosku o strukturze tak:

  • /
  • --file1
  • --file2
  • -/admin
  • ---- plik1
  • ---- plik2
  • -/public
  • ---- plik1

Nasza aplikacja dodatek będzie mieć strukturę jak tak (należy pamiętać, mamy wiele aplikacji dodatek):

  • /
  • --filex
  • -/admin
  • ----/myapp
  • ------ plik1
  • ------ fi LE2
  • -/public
  • ---- filex

Mamy eksperymentował z następujących metod, każda z własnymi zastrzeżeniami:

  1. Wszystkie aplikacje w jednym repozytorium. Jest to mniej niż idealne, ponieważ staje się koszmarem, skutecznie zarządzającym wersjami dla każdej aplikacji (szczególnie w SVN). Rozgałęzianie i tagowanie zabierają pliki z niepowiązanych i oddzielnych aplikacji.
  2. Wszystkie aplikacje w osobnym repozytorium. Nie jest to również idealne (cóż, jest to kwestia zarządzania/organizacji), ponieważ nie można wyeksportować dwóch oddzielnych repozytoriów do jednego folderu, więc zawsze pracujesz przy kasie jednego repozytorium i eksportowaniu innych. Jeśli pracujesz nad aplikacją X i są zmiany w naszej aplikacji głównej, musisz ręcznie wykonać nowy eksport tej aplikacji głównej i skopiować pliki do repozytorium aplikacji X, nad którym pracujesz, aby mieć najnowszy kod frameworka.

Czy istnieje sposób z git lub SVN (lub innym systemem kontroli wersji), aby zezwolić na więcej niż jedno repozytorium w jednym katalogu bez używania podkatalogów? SVN externals jest prawie idealny, ale wymaga, aby wszystkie pliki w zewnętrznym repozytorium znajdowały się w osobnym podfolderze, co, jak opisano powyżej, nie działa dla nas. GIT ma równoważne możliwości, ale znowu nie mogę pozwolić na więcej niż jedno repozytorium w jednym folderze, pozostawiając nam ten sam problem.

Podobne pytania: Multiple repositories in one directory (same level) - is it possible? - to jest bardzo blisko tego, co pytam myślę, ale nie widzę żadnego rozwiązania, które czułem można zastosować do naszej sytuacji.

+0

z git, zwykle zrobić coś z gałęziami Każdy deweloper może mieć jeden lub każdy moduł częściowy lub dowolną kombinację, którą możesz wymyślić Kiedy poczujesz, że jesteś gotowy do połączenia swojej gałęzi z główną (lub jakąkolwiek inną) gałęzią, robisz to. – Timo

+0

Aby być bardziej dokładnym : Możesz mieć jedną gałąź dla głównej aplikacji i na tej podstawie zdefiniować gałęzie modułów: dziedziczą strukturę katalogów, ale niezależnie od tego, co w nich włożysz, pozostanie tam. Wadą jest to, że nie możesz pracować z wieloma oddziałami naraz: musisz nadal kasa ich indywidualnie, ale wszystko w rzeczywistości będzie w jednym katalogu i możesz przenosić rzeczy z jednej gałęzi do drugiej dość łatwo. – Timo

+0

+1 za przeniesienie do git. A przynajmniej rozważając to. –

Odpowiedz

2

Subwersja 1.6 i 1.7 dopuszcza zewnętrzne dane pojedynczego pliku.

Zobacz http://svnbook.red-bean.com/en/1.7/svn.advanced.externals.html

„Subversion 1.6 wprowadzono także wsparcie dla definicji zewnętrznych plików. Plik externals są skonfigurowane tak jak zewnętrznymi dla katalogów i pojawia się jako plik wersjonowanym w kopii roboczej.

Na przykład, powiedzmy, że masz plik/trunk/bikeshed/blue.html w repozytorium, a chcesz ten plik wyglądał w rewizji 40, do stawienia się w kopii roboczej/trunk/www/jak green.html.”

+0

To było prawie idealne. Poza tym, że możesz używać tylko zewnętrznych plików SVN w tym samym repozytorium. Naszym celem było posiadanie jednego repozytorium na aplikację - jeśli będziemy mieli wszystkie pliki w jednym repozytorium, nie będziemy mieli tego zewnętrznego numeru referencyjnego. – bfarber

+0

Ok, ostatecznie zdecydowałem się teraz na prostotę: (1) przenieść nasze aplikacje addon do folderu gałęzi głównej aplikacji (branch/app1/trunk, branches/app2/trunk, etc.). Możemy wtedy wersję tych aplikacji (branches/app1/1_2_x) i możemy użyć zewnętrznych SVN, aby przeciągnąć pliki do głównego folderu aplikacji, ponieważ są one teraz technicznie w tym samym repozytorium. To działa idealnie. – bfarber

+0

Cieszę się, że to wymyśliliście! Dziękujemy za udostępnienie ostatecznego rozwiązania. – lvmisooners

3

nigdy nie próbował zrobić coś takiego w środowisku produkcyjnym, ale można na pewno zrobić:

 
$ git init 
$ mv .git .git1 
$ git init 
$ mv .git .git2 
$ export GIT_DIR=.git1 
# do work in first repo 
$ export GIT_DIR=.git2 
# do work in second repo 
+0

Niestety, niezbyt zaznajomiony z gitem jest to nieco ponad moje zrozumienie (nie twoja wina). Widziałem podobne sugestie w Internecie i jeśli przejdziemy do git, powrócę do tego. Dzięki. – bfarber

+0

Wszystkie informacje git używa do śledzenia repo jest przechowywany w jednym katalogu. Ten katalog ma nazwę GIT_DIR. Zmieniając GIT_DIR, zmieniasz repozytoria, zachowując ten sam katalog roboczy. –

+0

Myślę, że otrzymuję to, co robią powyższe polecenia. Zdecydowaliśmy się wstrzymać wypróbowanie git (czas zawsze działa przeciwko nam), ale powrócę do tego w przyszłości. Dzięki! – bfarber

3

git pozwala określić Work-katalog i git-katalog na komendzie najwyższym poziomie git:

git status 

mogą być zmieniane, aby użyć innego folderu .git z

git --git-dir=some/other/path/to/a/different/.git/folder status 

Podobnie można określić inny folder roboczy:

git --work-tree=some/other/path status 

Można również łączyć 2.

Jeśli trzeba mieć to workflow cały czas, można zastąpić i owinąć polecenia git zawsze wskaż konkretny katalog .git lub katalog pracy. Przykładem jest "git osiągnięć", który przechwytuje polecenia git i daje nagrody za poprawę z git, a następnie wywołuje rzeczywiste polecenie git: https://github.com/icefox/git-achievements

Wygląda na zabawny problem do rozwiązania.

Chciałbym również spojrzeć na samo posiadanie oddziału na aplikację i nieustannie odnawiać te gałęzie nad wszelkimi pracami wykonanymi dla podstawowej aplikacji. To byłby mój pierwszy wybór.

+0

Nie będąc zbyt obeznanym z git i jak jest on używany w praktyce (w porównaniu do SVN lub CVS, gdzie rzeczy są scentralizowane), będę musiał przeczytać nieco więcej o tym, jak ten scenariusz jest częściej rozwiązywany z git. Przyjrzymy się odgórnej sugestii, dzięki. – bfarber

+0

Prostota Gita Cię zawodzi :) poznaj folder .git i jego strukturę. Niezwykle prosty, gdy go zrozumiesz. –

+0

Ze względów czasowych zdecydowaliśmy się wstrzymać wypróbowanie git. Wszyscy są dobrze zaznajomieni z SVN, a nie każdy lubi wchodzić w głąb tego typu rzeczy, więc jest to przejście, które musimy lepiej zaplanować, jeśli zdecydujemy się na tę trasę. Dzięki za porady - powrócę do tego w przyszłości, jeśli damy gitowi strzał. – bfarber

Powiązane problemy