2010-08-08 5 views
18

Gibt es eine Möglichkeit, einen Repo zu klonen, der mit Subrepos kommt, aber ohne dass Mercurial alle Subrepos zieht?Mercurial `hg clone`, aber alle Subreposes ignorierend?

Es scheint, dass, während hg clone -U verwendet werden kann, um einen leeren Klon eines Repo zu erhalten, gibt es nichts, das hg update überzeugen würde, zu starten durch Ziehen aller Subrepos zu vermeiden.

Ich sollte darauf hinweisen, dass es wichtig ist, die Fähigkeit zur einfachen Synchronisierung mit der Kopfrevision nach dem Erstellen eines solchen Klons beizubehalten.

Antwort

5

Diese Antwort mehr als die Frage erforderlich hinzufügen kann, sondern bietet einige wertvolle Hinweise auf mit Mercurial arbeiten, wenn Sie nicht zu einem schlechten subrepository Pfad tun aktualisieren oder Revision.

Schritt 1: Klonen Sie das Repository ohne Updates

hg clone --noupdate source_repository destination_repository 

Schritt 2: Verwenden Sie zurückkommen, die richtigen Dateien

hg revert --all --rev revision_number --exclude subrepo_1 --exclude subrepo_2 ... 

An dieser Stelle bekommen Sie einen neuen changeset haben; Möglicherweise müssen Sie sicherstellen, dass die übergeordnete Version korrekt ist. Wenn ich das tat, war der Elternteil meines neuen changeset changeset 0. Um das zu beheben, musste ich das Eltern-Changeset setzen UND Zweige wechseln (da mein Changeset in einem anderen Zweig war).

Schritt 3: Ändern Sie die Eltern des aktuellen ändert

hg debugsetparents revision_number 
hg branch branch_name 

Das sollte es tun.

+2

Nach Schritt 3 zeigt 'hg status' weiterhin alle Dateien als ausstehende Hinzufügungen an. Das Ausführen von 'hg debugrebuildstate -r tip' behebt das Problem. –

3

Wenn Sie ein Subrepo haben, muss ein Arbeitsverzeichnis eine Version dieses Subrepo enthalten. Diese Version kann eine festgelegte ältere Version sein, falls angegeben, oder der Tipp, falls nicht.

Sie können Ihr Repo nicht aktualisieren, ohne die Subrepos zu erhalten; Wenn Sie ein vollständiges Arbeitsverzeichnis ohne diese hatten, sollten Sie keine Subrepos verwenden - verwenden Sie stattdessen wirklich externe Repos.

Wenn Ihre Subrepos mit einer bestimmten Remote-Version verbunden sind, werden Aktualisierungen nach der ersten kein Subrepo-Update auslösen - sie sind bereits auf dem neuesten Stand. Aber für die erstmalige Erstellung des Arbeitsverzeichnisses müssen Sie einen Remote-Pull durchführen.

Sie können Mercurial durch Munging der Datei hgsubstate Trick. Aber wirklich, Ihr Modell und das konzeptionelle Modell unterscheiden sich, also sind Sie wahrscheinlich nicht gut für Subrepos geeignet, wenn dies ein Problem ist.

bearbeiten: Wenn Sie sich klonen und dann mehrmals auf die Spitze aktualisieren, versuchen Sie es stattdessen mit lokalen Zweigstellen oder . Auf diese Weise müssen Sie nur einmal den ersten Klon erstellen.

+0

Sie scheinen die meiste Zeit eine gute Übereinstimmung zu sein. Es ist nur so, dass die Subrepos groß sind, und der beste Weg zum Vergleich mit dem offiziellen "Server", den ich gefunden habe, ist ein sauberer lokaler Checkout. Die Subrepos fügen diesem Ansatz eine Menge Overhead hinzu. –

+0

@romkyns: Wenn Sie nur nachverfolgen möchten, was Sie geändert haben, verwenden Sie 'hg out' (oder' hg diff' für nicht festgeschriebene Änderungen). Oder du könntest einfach den "sauberen" Klon einmal erstellen, und gelegentlich "hg pull -u" verwenden, um ihn auf dem neuesten Stand zu halten ... – Borealid

+0

Danke, ich denke, ich muss nur ein paar zusätzliche Kopien davon tolerieren diese riesigen Subrepos. Ich finde 'hg diff' für die Überprüfung von Code suboptimal und verwende stattdessen ein externes GUI-basiertes diff. –

4

Found einen hacky Weg. Es erfordert weiterhin, dass alle Subrepos einmal ausgecheckt werden, aber danach können sie gelöscht werden.

  1. Klonen Sie die ganze Menge, einschließlich Subrepos. Umsonst.
  2. löschen subrepos
  3. hg remove .hgsub

Ich versuchte Mercurial hg remove .hgsub zu überzeugen, bevor die subrepos geklont werden, aber das Beste, was ich ist not removing .hgsub: file is untracked bekam.

+6

Das ist eine Schande. –

+6

Diese Lösung hilft nicht wirklich, wenn Ihr externer Subrepo aus irgendeinem Grund nicht erreichbar ist. Einige Diskussionen über das Ignorieren von Subrepos [hier] (http://mercurial.selenic.com/bts/issue2520). –

13

Dies sollte das tun, was Sie wollen:

REM Take a new clone, but do not update working directory 
hg clone --noupdate %REPO_PATH% %DESTINATION% 

REM Update working directory but exclude the certain subprojects 
hg revert --all --rev %BRANCH% --exclude %SUBREPO_PATH_1% --exclude %SUBREPO_PATH_2% 
Verwandte Themen