2010-12-08 11 views
8

Ich bin ziemlich neu zu mercurial, ich habe viel zu diesem Thema gelesen, aber ich konnte keine klare Antwort finden.subrepo, hg klon und symlinks

The mercurial guide sagt: "Aus Gründen der Effizienz werden Hardlinks für das Klonen immer dann verwendet, wenn sich Quelle und Ziel auf demselben Dateisystem befinden (dies gilt nur für die Repository-Daten, nicht für das Arbeitsverzeichnis)."

Die Repository wiki page sagt: "Alle Dateien und Verzeichnisse, die koexistieren mit dem. Hg-Verzeichnis im Repository-Stamm werden angeblich im Arbeitsverzeichnis leben".

nun eine subrepo in einem Haupt Repo "link" do I:

hg init main 
cd main 
echo subrepo = ../subrepo > .hgsub 
hg clone ../subrepo subrepo   # (1) 
hg add 
hg ci -m "initial rev of the main repo" 

Ist die obige Definition bedeutet, dass ich eine wirklich bin Erstellen Kopie von subrepo, wenn ich (1) durchführen? ? Oder erstelle ich nur einen symbolischen Link zu ../subrepo? Entsprechend der Ausgabe von ls ist es eine tatsächliche Kopie. Aber es klingt für mich so seltsam ... Wenn jemand etwas Licht in dieses Thema bringen könnte, würde ich mich freuen.

+1

Nur ein Nitpick, weil Sie beide Wörter verwendet haben, als ob sie austauschbar sind: [harte Links sind keine symbolischen Links] (http://linuxgazette.net/105/pitcher.html). Der Unterschied besteht im Wesentlichen darin, dass feste Links innerhalb eines Dateisystems liegen und nicht brechen können, während symbolische Links nur einen Pfad enthalten und auf andere Dateisysteme verweisen können. Mercurial verwendet nur feste Links. –

Antwort

6

Zunächst einmal dieser Teil von Mercurial, ich bin kein Experte, aber hier ist, was ich verstanden habe.

Nein, Sie haben keine Verknüpfung zum gesamten Verzeichnis erstellt. Stattdessen wurden die Dateien fest verkabelt.

Dies bedeutet, dass Speicherplatz auf der Festplatte reserviert ist, um Ihre Verzeichnisstruktur getrennt zu halten, aber die Dateien sind alle identisch, weil sie nur geklont wurden, so dass sie als Links zurück zum Original erstellt werden.

Wenn Sie das Repository starten Manipulation durch Ihre add oder commit (ci) Befehle, dann sind die Hardlinks von Mercurial und separate Dateien gebrochen werden, werden für jede aufgebaut, auf Anfrage.

Nun ist dies eine rein technische Angelegenheit, die Sie nicht wissen oder sich darum kümmern müssen. Wenn es einfacher ist, denken Sie einfach an einen Klon als eine vollständige Kopie des ursprünglichen Repository, separate Dateien und all das. Der Hardlink-Teil dient nur dazu, Speicherplatz für die gleichen Dinge zu sparen.

Da ein typisches Projekt viele Dateien enthält und ein typischer Änderungssatz nur einige wenige Dateien ändert, und ein typischer Grund zum Klonen ist, dass Sie eine feste Reihe von Änderungen vornehmen, machen Hardlinks für viele der Dateien Sinn in den Repository-Verzeichnissen sind 100% identisch mit ihrem Original für die Lebensdauer des Repositorys.

Für die, die nicht sind, wird alles still von Mercurial für Sie gehandhabt.

+0

+1 Internals getrennt, sollte man die üblichen Praktiken des Klonens folgen. Es ist jedoch ok, zu Lernzwecken zu spielen. – pyfunc

2

Lassen Sie uns damit beginnen, was passiert, wenn Sie klonen, ohne über Subrepositories zu sprechen. Wenn Sie das tun

$ hg clone A B 

dann Mercurial harte Links machen für die Dateien innerhalb A/.hg/store/data.Also, wenn eine Datei mit dem Namen x verfolgt wird, dann nach dem Klon Sie werden sehen, dass

A/.hg/store/data/x.i 

und

B/.hg/store/data/x.i 

hart verknüpft sind - bedeutet dies, dass die beiden Dateinamen wirklich beziehen sich auf die gleiche Datei . Wie Lasse darauf hinweist, ist dies klug, da Sie möglicherweise niemals eine Änderung an x Clone vornehmen werden, und so gibt es keinen Grund, zwei verschiedene x.i Dateien für die A und B Klone zu machen. Ein weiterer Vorteil ist, dass es viel schneller ist, eine feste Verbindung herzustellen, als eine Datei zu kopieren, besonders wenn x.i sehr groß ist: Die feste Verbindung ist eine konstante Zeitoperation.

In Ihrem obigen Beispiel fügen Sie ein Unterverzeichnis subrepo zum main Repository hinzu. Ein subrepository besteht aus zwei Dingen:

  1. die subrepository selbst. Das, was schafft Sie, wenn Sie tun

    $ hg clone ../subrepo 
    
  2. die subrepository Metadaten. Dies speichern Sie in der Datei .hgsub. Sie müssen Mercurial mitteilen, wo Sie das Unterverzeichnis haben möchten und woher es von Mercurial geklont werden kann.

Sie fragen, ob Sie das Repository kopieren oder Symlink, und Sie sicher kopiert (geklont) es, wie Sie auch mit ls bestätigt haben. Anschließend haben Sie Mercurial einige Metadaten hinzugefügt, die ihm sagen, wo es das Subrepository erwarten kann. Dies hat nichts mit einer symbolischen Verbindung im normalen Dateisystem zu tun, es sind nur einige Metadaten für Mercurial.