2009-05-28 4 views
58

Ich habe ein Mercurial-Repository mit einer Handvoll verwandter Projekte. Ich möchte nur eines dieser Projekte abzweigen, um anderswo daran zu arbeiten.Wie klone ich einen Unterordner eines Repository in Mercurial?

Ist das Klonen nur ein Teil eines Repositories, und ist das der richtige Weg, dies zu erreichen?

+0

Von dem, was ich gehört habe, ist dies ein Grund, nicht mehrere Projekte in einem Repo zu platzieren. –

Antwort

51

Was Sie wollen, ist ein narrow or partial clone, aber dies wird leider noch nicht unterstützt.

Wenn Sie bereits ein großes Repository haben, und Sie erkennen, dass es Sinn machen würde, es in mehrere kleinere Repositorys zu spalten, dann können Sie die convert extension verwenden eine Mercurial Mercurial Umwandlung zu tun. Beachten Sie, dass dadurch ein neues Repository foo erstellt wird und Sie nicht zwischen your-big-repo und foo drücken/ziehen können.

Die convert extension ist standardmäßig nicht so fügen Sie den folgenden Code zu Ihrem Repo hgrc Datei oder Ihre mercurial.ini Datei aktiviert:

[extensions] 
hgext.convert= 

Dann erstellen Sie eine map.txt Datei mit

include "libs/foo" 
rename "libs/foo" . 

(beachten Sie verwenden können, Vorwärts Schrägstriche sogar unter Windows) und führen

$ hg convert --filemap map.txt your-big-repo foo 

Das macht foo ein Repository mit der vollständigen Geschichte der libs/foo Ordner von your-big-repo.

Wenn Sie alle Beweise von foo von your-big-repo löschen möchten, können Sie eine andere Konvertierung vornehmen, wo Sie exclude libs/foo verwenden, um das Verzeichnis loszuwerden.

Wenn Sie mehrere Repositories haben und diese als Ganzes verwenden möchten, sollten Sie sich die Datei subrepositories ansehen. Mit dieser Funktion können Sie andere Repositorys in einen Checkout einschließen - ähnlich wie svn:externals funktioniert. Bitte folgen Sie der recommendations auf dieser Wiki-Seite.

+0

Danke - Ich habe einen Workaround gefunden für was ich tun muss. Interessant, um die Probleme zu sehen. –

+27

Worin bestand die Problemumgehung, auf die Sie gekommen sind? –

+20

Argh! "Ich habe einen wahrhaft wunderbaren Beweis dafür gefunden, dass dieser Spielraum zu klein ist, um ihn einzudämmen." – Matt

3

Es ist nicht möglich, hg clone wird das gesamte Repository klonen.

Sie können sich die Unter-Repository-Erweiterung ansehen, die es Ihnen ermöglicht, Repositories in einem Repository zu haben, die Ihren Anforderungen entsprechen.

11

Anstatt einen Teilklon zu erstellen, können Sie den Repo mit der Nummer Convert Extension in mehr als ein Repo nach Unter-Repository aufteilen.

Insbesondere finden Sie im Abschnitt Converting from Mercurial:

es auch nützlich ist Mercurial Repositories zu filtern Subsets eines bestehenden zu erhalten. Zum Beispiel eines Unterverzeichnis subfoo ein Endlager foo in ein Repository mit seinem eigenen Leben zu verwandeln (während seiner ganzen Geschichte zu halten), wie folgt vorgehen:

$ echo include subfoo > /tmp/myfilemap 
$ echo rename subfoo . >> /tmp/myfilemap 
$ hg convert --filemap /tmp/myfilemap /path/to/repo/foo /tmp/mysubfoo-repo 
2

Diese gerade nach vorne mit den Convert extension ist.

+0

Dies ist eine sehr gültige Lösung, warum wurde sie als -1 gewählt? – cheenu

+1

Meine Vermutung liegt darin, dass die Lösung es nicht wirklich erlaubt, ein Unterverzeichnis aus einem Repository zu klonen. Stattdessen können Sie ein vorhandenes Repository in ein neues und kleineres Repository konvertieren, das Sie anschließend klonen können. –

+5

1) Wie oben erwähnt, beantworten Sie nicht die Frage, die die ursprüngliche Frage gestellt hat. 2) Sie erklären nicht, dass die ursprüngliche Frage unmöglich ist. Sie bieten nur etwas anderes an. 3) Sie geben einen Link, anstatt ihn zu erklären. –

6

Ich habe accross dieses Problem gestolpert und fand einen Weg, es zu tun: Verwenden von Symlinks (Linux leider nur)

Zum Beispiel, wenn Sie benötigen nur /project im Repository, auf Ihrem Computer Klon den Repo in einem anderen Ordner, dann verwenden Sie ln -s /repo/location/ project. Mercurial wird damit umgehen

1

(Ende 2016) Mainline Mercurial bietet immer noch keine Unterstützung für "enge Klone", aber es gibt Erweiterungen von Drittanbietern, die das Problem auf unterschiedliche Weise angehen.

Wenn Sie mit nur einem schmalen Kasse (auch bekannt als „spärliche Kasse“ oder „teilweise Kasse von Dateipfad“), dann die Facebook sparse.py Erweiterung aus dem hg-experimental repository (Blick ins Innere der hgext3rd/ Verzeichnis) bewältigen kann praktikabel sein kann. In diesem Szenario klonen Sie immer noch den vollständigen Verlauf (das Verzeichnis ".hg" ist also nicht kleiner), aber Ihr Arbeitsverzeichnis zeigt nur eine Teilmenge des vollständigen Repositorys an.

Google hat alternativ eine NarrowHG extension erstellt, die Klonen (auch bekannt als "partielles Klonen von Dateipfad") schmal. Sie müssen die Kontrolle über den Server und den Client haben und bereit sein, experimentelle Features zu verwenden, aber es beschränkt den kopierten Verlauf des Klons in .hg wirklich auf eine Untermenge dessen, was sich im ursprünglichen Repository befand.