2009-08-19 8 views
19

Angenommen, ich habe ein Projekt in der Quellcodeverwaltung mit vielen Unterverzeichnissen, von denen ich viele im Moment nicht brauche.Ist es möglich, einen partiellen Klon/Zweig mit Basar, Mercurial oder Git zu machen?

Ich möchte eine Arbeitskopie erstellen, die nur einen Teil des gesamten Baums enthält, der immer noch die Fähigkeit behält, Änderungen vorzunehmen, sie zu committen und wieder hochzuladen.

Ist dies möglich und wenn ja, wie kann ich das tun?

Ich bin immer noch entscheiden, ob mit Basar oder Mercurial gehen, so dass Antworten in Bezug auf beide von denen hilfreich wäre.

Bearbeiten: Eigentlich Lösungen für Git wäre auch nützlich.

Antwort

10

Wenn Sie bereits ein Repository haben und dies tun möchten, wird es sehr schmerzhaft sein.

Wenn Sie dies mit brandneuen Repositories tun möchten, sollten Sie sich Mercurials neuen subrepos ansehen.

Grundsätzlich erstellen Sie eigenständige Repositories für bestimmte Verzeichnisse:

myproject/ 
    .hg/ 
    source code/ 
     ... files here ... 
    documentation/ (subrepo) 
     .hg/ 
     ... files here ... 
    graphics/ (subrepo) 
     .hg/ 
     ... files here ... 

Das die verschiedenen Teile des Projekts in unterschiedlichen Repositories isoliert. Der "enthaltende" Repo (in diesem Fall mein Projekt) verfolgt, welche Revision die Subrepos bei jedem Commit durchführen. Die Subrepo-Wiki-Seite, die ich erwähnt habe, erklärt es gut.

6

Nach this wiki page zu urteilen, ist diese Funktion in Mercurial noch nicht implementiert, jedoch gibt es eine extension, die ungefähr so ​​funktioniert, wie Sie wollen, indem Sie ein Repository oder seinen Teil konvertieren und nicht verzweigen. Da es von und zu Hg konvertieren kann, kann es als partielles Klonen funktionieren. Ist das, was du gebraucht hast?

+2

Dies ist eine nützliche Antwort, Beachten Sie jedoch die wichtigen Vorbehalte: 'hg convert' lässt Sie einen Klon nur eines Teils eines Repositorys erhalten, aber die Changesets werden nicht die gleichen SHA-1 IDs wie die Changesets im Original haben. Sie können nicht zum ursprünglichen Repository zurückkehren (zumindest nicht sicher), obwohl Sie versuchen können, die vorgenommenen Änderungen manuell zu verwalten (z. B. mit 'hg transplant'). Es ist nicht ideal für einen Langzeitklon. – quark

4

In den meisten DCVS ist die Regel "1 Projekt == 1 Repository". Es gibt keine Vorstellung von "Teilprojekt" (anders als in Subversion, wo Sie einen Teilbaum auschecken und daran arbeiten können).

Der Hauptgrund ist, dass Ihr "Projekt" eine Kopie des gesamten Repository im Stammordner enthält. Die Dinge würden ziemlich kompliziert werden, wenn Sie Kopien des gesamten Repository in Unterordnern erstellen könnten.

Auf der positiven Seite ist das Erstellen von Arbeitskopien eine schnelle Operation (außer das zugrunde liegende Dateisystem ist langsam).

14

Klonen einer Teilmenge des Baumes ist nicht möglich, soweit ich weiß, aber es gibt andere Möglichkeiten.

Git: Der Befehl hat eine git clone--depth Flag:

--depth <depth>

einen flachen Klon erstellen mit einer Geschichte auf die angegebene Anzahl von Revisionen abgeschnitten. Ein seichtes Repository hat eine Reihe von Einschränkungen (Sie können es weder klonen oder abrufen, noch von oder in es hineinschieben), aber es ist angemessen, wenn Sie nur an der jüngsten Geschichte eines großen Projekts mit einer langen Geschichte interessiert sind und dies auch tun möchten senden Sie Fixes als Patches.

Bazaar: Die Flagge --lightweight für den checkout Befehl lädt nur ein Arbeitsverzeichnis, anstatt die ganze Geschichte und spart Bandbreite und Speicherplatz. Alle Operationen werden weiterhin unterstützt, eine Netzwerkverbindung ist jedoch erforderlich, um sie auszuführen.

Ich weiß nicht, ob Merurial diese Funktion hat oder nicht.

3

Für Bazaar haben Sie verschachtelte Bäume: http://bazaar-vcs.org/NestedTreesDesign, mit denen Sie ein großes Projekt in Teilprojekte aufteilen können.
Ich habe diese Funktion noch nicht verwendet, also weiß ich nicht, wie gut es funktioniert.

Sie können auch verzweigen mit --hardlink, um das Kopieren einer Reihe von Dateien zu vermeiden (nicht sicher, ob es unter Windows funktioniert ...)), Zweig ohne Geschichte (heller Zweig) oder Zweig ohne funktionierenden Baum (keine Dateien, nur Geschichte).

+3

Dies wird auch in anderen DVCS unterstützt: es ist ** Git-Submodul in Git **, und ich denke ** Forest Erweiterung in Mercurial **. Aber es ist nur tangential verwandt mit dem, wonach das ursprüngliche Poster gefragt hat, denke ich, weil es extra Setup * im Voraus * erfordert. –

+0

Diese werden auf der Seite erwähnt, auf die ich verlinke. Ich habe es gerade versucht: Split auf einem bestehenden Testbaum verwendet, die Änderung begangen, dann verzweigte den Teilbaum, es funktionierte. Keine Notwendigkeit, das im Voraus zu tun, zumindest für bzr. – PhiLho

+2

@Jakub: Sie brauchen nicht die Forest-Erweiterung irgendein mroe - SubRepos wurden dem Mercurial-Core in 1.3 hinzugefügt. –

5

In git, können Sie git subtree verwenden, die Sie für nur einen bestimmten Teilprojekt ein „virtuelles“ Repository lassen extrahieren, dann im Teilprojekt Änderungen vornehmen und diese Änderungen dann wieder zusammenführen in.