2009-03-02 10 views
11

Jak korzystać z Mercurial dla następującego problemu.Używanie Mercurial do oddzielnej wersji prywatnej i publicznej

Załóżmy, że mam rdzeń biblioteki. Teraz chcę rozwinąć rozszerzenie do tej biblioteki o nazwie Extension. Chcę, aby Core był fizycznie oddzielony od Extension, tj. Powiedzmy, że Core jest biblioteką open source, a Extension jest biblioteką prywatną opartą na Core (może zawiera pewne rzeczy, które chcę zachować w pamięci). Oczywiście nie chcę przesyłać całego źródła w Extension do publicznego repozytorium kiedykolwiek. Ale z drugiej strony mógłbym popchnąć pewne zmiany z Extension do Core (jeśli zdecydowałem się "przekazać" część rozszerzenia do Core) lub na odwrót (jeśli chcę wprowadzić poprawki błędów, powiedzmy).

Co byś zrobił, minimalizując ryzyko wycieku Extension to Core (po tym, jak historia zostanie przekazana na serwer publiczny, nie ma odwrotu!), Zachowując elastyczność, aby zrobić to dla pewnych zmian. Gałęzie? Klony? Mqs? Coś innego?

Obecnie jestem zaznajomiony tylko z repozytoriami klonowania i bardzo podobają mi się jego prostota.

EDIT: wymyśliłem tego programu, ale nie mogę zupełnie zmusić go do pracy w systemie Windows. Dwa repozytoria (podstawowe i rozszerzenie). W rozszerzeniu znajdują się dwie gałęzie , także Rdzeń i rozszerzenie. Teraz możesz zarejestrować na repozytorium hak w Mercurial, więc chciałbym zarejestrować hak "pretxnchangegroup" w repozytorium Core, które blokuje checkiny z gałęzi Extension, jako rodzaj wyjaśnionego in the Mercurial book. Tyle tylko, że nie całkiem mogę pracować pod Windowsem. A więc:

  • ktoś ma przykład czegoś podobnego (w rzeczywistości dowolny hak, który zmienia wynik transakcji) pod oknami?
  • Nadal będę mógł korzystać z przeszczepu, aby wyłuskać zmiany z gałęzi Rozszerzenie na rdzeń, prawda?

Odpowiedz

2

Po kilku testach zamierzam wypróbować ten schemat. Dwa główne repozytoria i dwie nazwane gałęzie, Core i Extension.

Jedno główne repozytorium podstawowe, które powinno zawierać tylko podstawowe zestawy zmian i źródło. Powinien zatem zawierać tylko zestawy zmian z oddziału Core. ta jest sprawdzana za pomocą następującego hak repozytorium w hgrc tego repo:

pretxnchangegroup.branch = hg heads --template "current branches: {branches} " | find "Extension" && exit 1 || exit 0

wygląda trochę dziwnie, ale w zasadzie to zostanie zwolniony po pchać lub ciągnąć się zakończy, ale zanim zostanie ona zatwierdzona. W tym momencie, jeśli zawieszenie się nie powiedzie, transakcja zostanie wycofana.Haczyk szuka zestawu zmian w gałęzi Extension i kończy się niepowodzeniem, jeśli go znajdzie - skutecznie uniemożliwiając wprowadzanie zmian Extension, aby wejść do Core repo.

Drugie repozytorium zawiera zarówno gałęzie bazowe, jak i rozszerzenia oraz zestawy zmian, i gdzie następuje wymiana zestawów między dwoma oddziałami. Normalne połączenie z Core do Extension i przeszczep z Extension do Core.

mam nadzieję, że to pomoże komuś innemu.

+0

Jak zmienić hak na * tylko * pozwolić Core? Czy to && wyjdzie z 0 || wyjść 1? –

1

(gdy historia jest wciśnięty, nie nie ma odwrotu!)

na pewno nie jest ... to co kontrola wersji jest o!

Jeszcze nie zrobiłem czegoś takiego, ale brzmi to tak, jak przydatne będzie polecenie transplant. Możesz też mieć klony klonów i popychać do któregokolwiek z nich, i tak dalej.

+0

Mam na myśli: po naciśnięciu jest prawie niemożliwe, aby odebrać go z serwera. Kod, który chciałbym zachować jako prywatny, jest teraz udostępniany światu. –

+0

Dobra porada dotycząca przeszczepu. –

+0

tak, to prawda, ale ty też chcesz lasy (jak wspomniano) ... zawsze zapominam o nich w mercurial. – nlucaroni

1

Dzięki Forest extension można zachować kilka repoów jako część dużego. Wygląda na to, że to może pomóc.

+0

Nie wiedziałem o tym, ale nie jestem pewien, jak to może pomóc. Wygląda na to, że jest bardziej nastawiona na sytuację, w której miałbym wiele ogólnodostępnych repozytoriów, które być może chciałbym nacisnąć/wyciągnąć naraz. To wydaje się zwiększać ryzyko przypadkowego popchnięcia na publiczny serwer. –

+0

Pomaga zachować prywatność i publiczny kod oddzielnie, ale w synchronizacji. Nie ma ryzyka pchania zmian między repo w lesie. Ale chcesz zachować Core jako czysty podzbiór rozszerzenia? To byłoby trudniejsze. : - | – Macke

Powiązane problemy