2009-10-08 18 views
5

Rozglądam się za zewnętrznymi elementami svn dla mojej firmy i wydaje się, że byłoby to dla nas dobrą cechą. Mamy kilka produktów, które często odwołują się do współdzielonych komponentów, ale mają zły nawyk polegania na starszych wersjach, a nawet na rozgałęzionych bazach kodu.Pomoc w zrozumieniu SVN Externals

Przeczytałem przyzwoity kawałek o tym, jak działają teraz i myślę, że rozumiem koncepcję OK. Nie jestem w 100% pewien, w jaki sposób różne wersje wielu repozytoriów łączą się ze sobą.

Załóżmy, że mam produkt i bibliotekę. Produkt jest budowany przeciwko bibliotece, więc jego repozytorium ma właściwość svn: externals, która łączy się ze źródłem biblioteki. W przypadku braku konkretnej wersji w definicji svn: externals, gdy sprawdzę HEAD produktu, otrzymuję również HEAD of Library.

Zbudowuję kilka wersji produktu na przestrzeni lat, za każdym razem odwołując się do najnowszej wersji Biblioteki. Pewnego dnia jednak muszę wrócić i sprawdzić wersję 1 produktu, ręcznie wybierając poprawną wersję. Kiedy to zrobię, jaką wersję biblioteki otrzymam, HEAD lub wersję, której użyłem, kiedy ją zbudowałem za pierwszym razem?

Mam nadzieję, że byłem dobrym programistą i zapamiętałem, aby otagować każdą wersję produktu, którą wypuszczam. Kiedy zastosuję mój tag "Product-1-0-0" do repozytorium, czy poprawiona wersja repozytorium biblioteki również zostanie oznaczona tagami? Jeśli później wypróbuję produkt oparty na tagu "Produkt-1-0-0", czy poprawiona wersja biblioteki zostanie z nim wyewidencjonowana?

Odpowiedz

6

Trzeba uważać przy pomocy svn:externals, że musisz wyraźnie określić wersję, jeśli chcesz coś innego niż trunk. Google "pinning svn:externals" w celu uzyskania szczegółowych informacji. Jeśli używasz dość nowoczesnej wersji, 1.5 lub nowszej IIRC, to przynajmniej zewnętrzne są obsługiwane. Starsze wersje, takie jak ta, której obecnie używam, wymagają od nas jawnego przypięcia wersji przy użyciu opcji -rNNNNN w usłudze svn:externals dla w każdym cholernym folderze.

Skończyliśmy z wykorzystaniem modyfikacji skryptu perl o nazwie svncopy.pl z tigris.org, aby wykonać wszystkie nasze rozgałęzianie i tagowanie. Nie jest tak źle, ale żałuję, że nie wiedzieliśmy, ile mamy pracy, zanim zdecydowaliśmy się na ich tak duże wykorzystanie.

+0

Dla svn: externals, powinieneś prawie zawsze ustawiać swoje obroty. W przeciwnym razie, jeśli zmienisz coś w rzeczach przywoływanych zewnętrznie, nie możesz przywrócić projektu do poprzedniego stanu. Ryzykujesz też łamaniem rzeczy, nie wiedząc o tym. Zobacz http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-dug-externals.html, "Użyj wyraźnych numerów wersji". –

5

Można użyć date specifiers, aby zapewnić aktualizację po aktualizacji.

Zrobiliśmy to dla narzędzia, które uruchamia program PC-Lint; lubimy uruchamiać go w każdej wersji, abyśmy mogli rozróżnić wyniki.

To trochę nieprzyjemny w jego realizacji - my:

  • określić co rev kopia robocza jest w (używając svnversion)
  • określić co rev głowa jest na (używając svn info)
  • chwyć znaczniki czasu dla wszystkich wersji do i włączając głowicę (używając svn log)
  • podbić znaczniki czasu o .999 sekund, aby uzyskać pewność, że otrzymamy rev (yay magic!)
  • aktualizacja do każdej wersji (przy użyciu svn update -r {sometimestamp})
  • uruchomić program PC-Lint na kopii roboczej, diff, mailout, Klaxons spust, co

(Complexity godne Rube Goldberg, prawda? Awanse i nieśmiertelna wdzięczność dla każdego, kto może zaproponować lepsze rozwiązanie.)

Możesz również zainteresować się sekcją książki svn na temat Peg and Operative Revisions, którą właśnie odkryłem - wydaje się to stosunkowo nowym dodatkiem.

1

Tak będzie, zakładając, że podajesz wyraźny numer rewizji na swoich zewnętrznych stronach, jak zasugerowano w docs. W przeciwnym razie użyje HEAD rewizji z zewnętrznymi odnośnikami.

Po prostu uważaj na pliki svn: externals w wersji 1.6. Wyglądają one bardzo przydatne, ale ja po prostu hit this bug dziś :(

2

Należy przeczytać na menedżerów zależność. - Nie jestem pewien, co twoja platforma jest, ale bluszcz i Maven rozwiązać ten problem w znacznie czystsze sposób

svn: externals nie są wersjonowane w subversion, jeśli ktoś zmieni wersję lub etykietę jednego z twoich zewnętrznych, nie masz możliwości dowiedzenia się, co to było przed zmianą:

Powiązane problemy