2010-12-16 22 views
18

Mein Projekt ist in den folgenden OrtenMuss ein Mercurial-Subrepository ein Unterverzeichnis des Haupt-Repository sein?

C:\Dev\ProjectA 
C:\Lib\LibraryB 
C:\Lib\LibraryC 

Derzeit jeder dieses Ordners ist eine völlig unabhängige Mercurial-Repository aus Code. Projekt A ändert sich ständig, Bibliothek B und Bibliothek C ändern sich selten.

Ich markiere derzeit jede Version von Projekt A, wie es veröffentlicht wird, und (wenn ich mich erinnere) ein entsprechendes Tag in die Bibliotheken B und C Repositories.

Kann ich das verbessern, indem ich Subrepositories verwende? Würde das erfordern, dass ich Bibliothek B und C zu einem Unterverzeichnis von Projekt A mache?

Wenn Bibliothek B und C Unterverzeichnisse von Projekt A sein müssen, was mache ich, wenn ich ein Projekt D starten möchte, das Bibliothek B verwendet, aber sonst nicht mit Projekt A verbunden ist?

Antwort

18

Wenn Bibliotheks-B und C Verzeichnisse von Project A sein muss, was ich tun , wenn ich ein Projekt D gestartet werden soll, dass Bibliothek B verwendet, ist aber nicht anders mit Projekt A verbundenen überhaupt?

Jedes Projekt kann sowohl existieren unabhängig und als subrepository eines anderen Projekts zur gleichen Zeit. Ich werde es erklären, indem ich einen Workflow vorschlage.

Zunächst einmal jedes Ihrer Projekte (A, B, C) sollte ein gesegnetes Repository hat, die irgendwo veröffentlicht wird:

blessed repository

Sie könnten hgwebdir auf Ihrem eigenen Server laufen, oder Gebrauch machen eines Mercurial Hosting-Dienstes wie Bitbucket oder Kiln. Auf diese Weise haben Entwickler einen zentralen Berechtigungspunkt, von dem Änderungen übernommen werden können, und Sie haben etwas, das Sie sichern können.

Jetzt können Sie Klone dieser Repositorys auf auf zwei verschiedene Arten zu arbeiten:

  • direkt Ihr Projekt klonen. Zum Beispiel:

    hg clone http://bitbucket.org/LachlanG/LibraryB C:\Lib\LibraryB 
    
  • und/oder erstellen subrepository Definitionen durch eine .hgsub Datei im Stamm von ProjectA mit folgendem Inhalt setzen:

    libraries/libraryB = http://bitbucket.org/LachlanG/LibraryB 
    libraries/libraryC = http://bitbucket.org/LachlanG/LibraryC 
    

Diese subrepository Definitionen Mercurial sagen, dass Wenn Projekt A geklont wird, müssen auch die Klone von Bibliothek B und Bibliothek C in den Ordner libraries gelegt werden.

Wenn Sie in Projekt A arbeiten und festschreiben, werden Ihre Änderungen in libraries/LibraryB und libraries/LibraryC ebenfalls übernommen. Mercurial zeichnet auf, welche Version der Bibliotheken von Projekt A in der Datei .hgsubstate verwendet wird. Das Ergebnis ist, dass wenn Sie zu einer alten Version des Projekts zu sehen, wie die Dinge letzte Woche funktionierte, erhalten Sie auch die entsprechende Version Ihrer Bibliotheken. Sie müssen nicht einmal Tags erstellen :-)

Wenn Sie hg push das Projekt A ändert, um das gesegnete Repository, Mercurial wird auch sicherstellen, dass die Änderungen an den Unterverzeichnissen zuerst an ihren eigenen Ursprung zu schieben. Auf diese Weise veröffentlichen Sie niemals versehentlich Projektänderungen, die von nicht veröffentlichten Änderungen der Bibliothek abhängig sind.

Wenn Sie es vorziehen, alles lokal zu speichern, können Sie diesen Workflow dennoch verwenden, indem Sie relative Pfade anstelle von URLs in den Definitionen der Unterrepositorys verwenden.

+0

Wo ist der Bibliotheksordner, den Sie am Ende des Satzes erwähnen? "Diese Subrepository-Definitionen sagen mercurial, dass, wenn projectA geklont wird, auch Klone von LibraryB und LibraryC in den Bibliotheksordner gestellt werden müssen." – LachlanG

+0

Es ist nur ein Ordner, der linke Teil des: Bibliotheken/libraryB = http://bitbucket.org/LachlanG/LibraryB ist, wo der Klon von der rechten Seite sein sollte –

+0

@LachlanG: Es wird im Stamm des ProjectA angezeigt klonen, zum Beispiel 'C: \ Dev \ ProjectA \ libraries \'. –

2

Sie in der Tat B und C subrepos des Projekts erklären können A (sie werden als Unterverzeichnis erscheinen, wie in Mercurial Subrepository beschrieben).
Das Ihren Freigabemechanismus verbessern würde, wie es Ihnen erlauben würde:

  • alle repos erhalten an einem Ort (A und unter) jeden
  • Referenz einen genauen Tag von B und C unter A
  • Tag Sub-Repo s zuerst, wenn sie irgendeine Änderung hatten
  • Tag A mit den Informationen über B und C Tags darin (jeder Klon von A wird in der Lage sein, die exa zu bekommen ct-Tags von B und C verwendet von A)

Sie können auch B als subrepo von D erklären, unabhängig von A. Was Sie in A (in Bezug auf B) machen, hat keine Konsequenzen für B in verwendet.

Verwandte Themen