9 Stimmen

subrepo, hg clone und symlinks

Ich bin ein ziemlicher Neuling auf dem Gebiet von Mercurial, ich habe viel über dieses Thema gelesen, aber ich habe keine klare Antwort gefunden.

Der quecksilbrige Führer sagt: "Aus Gründen der Effizienz werden Hardlinks für das Klonen immer dann verwendet, wenn Quelle und Ziel auf demselben Dateisystem liegen (beachten Sie, dass dies nur für die Repository-Daten gilt, nicht für das Arbeitsverzeichnis)."

En Repository-Wiki-Seite sagt: "Alle Dateien und Verzeichnisse, die mit dem .hg-Verzeichnis im Repository Root koexistieren, sollen im Arbeitsverzeichnis leben".

Nun, zu "Link" ein subrepo in einem Haupt repo ich tun:

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"

Bedeutet die obige Definition, dass ich tatsächlich eine kopieren. von subrepo wenn ich (1) ausführe? Oder erstelle ich nur einen Symlink zu ../subrepo ? Nach der Ausgabe von ls ist es eine aktuelle Kopie. Aber es klingt so seltsam für mich... Wenn jemand ein wenig Licht auf dieses Thema setzen könnte, würde ich zu schätzen wissen.

6voto

Lasse V. Karlsen Punkte 364542

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

Nein, Sie haben keinen Link zu dem gesamten Verzeichnis erstellt. Stattdessen wurden die Dateien innerhalb des Verzeichnisses fest verlinkt.

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

Wenn Sie mit der Bearbeitung des Repositorys beginnen, können Sie über Ihre add o commit ( ci ) Befehle, dann werden die Hardlinks von Mercurial aufgebrochen und für jede Datei werden bei Bedarf separate Dateien erstellt.

Dies ist eine rein technische Angelegenheit, die Sie nicht zu kennen brauchen oder die Sie nicht interessiert. Wenn es Ihnen die Sache erleichtert, stellen Sie sich einen Klon einfach als eine vollständige Kopie des ursprünglichen Repositorys vor, mit separaten Dateien und all dem. Der Hardlink dient nur dazu, Speicherplatz für die Dinge zu sparen, die gleich sind.

Da ein typisches Projekt viele Dateien hat und ein typischer Änderungssatz nur einige wenige Dateien ändert, und ein typischer Grund für das Klonen darin besteht, dass Sie eine feste Anzahl von Änderungen vornehmen wollen, sind Hardlinks sinnvoll, da viele der Dateien in den Verzeichnissen des Projektarchivs während der gesamten Lebensdauer des Projektarchivs zu 100 % mit dem Original identisch sein werden.

Für diejenigen, die es nicht sind, wird das alles von Mercurial stillschweigend für Sie erledigt.

2voto

Martin Geisler Punkte 71257

Schauen wir uns zunächst an, was passiert, wenn man klont, ohne über Unter-Repositories zu sprechen. Wenn Sie das tun

$ hg clone A B

dann macht Mercurial feste Verbindungen für die Dateien in A/.hg/store/data . Wenn also eine Datei namens x verfolgt wird, dann werden Sie nach dem Klonen sehen, dass

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

y

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

hart verlinkt sind - das bedeutet, dass sich die beiden Dateinamen tatsächlich auf den gleiche Datei . Wie Lasse betont, ist dies klug, da Sie möglicherweise nie eine Änderung an x Klon, und daher gibt es keinen Grund, zwei verschiedene x.i Dateien für die A y B Klone. Ein weiterer Vorteil ist, dass es viel schneller ist, einen Hardlink zu erstellen als eine Datei zu kopieren, insbesondere wenn x.i ist sehr groß: Die feste Verbindung ist ein Vorgang mit konstanter Zeit.

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

  1. das Unter-Repository selbst. Dies erzeugen Sie, wenn Sie

    $ hg clone ../subrepo
  2. die Metadaten des Unterverzeichnisses. Diese speichern Sie in der Datei .hgsub Datei. Sie müssen Mercurial mitteilen, wo Sie das Unter-Repository haben wollen und von wo aus Mercurial es klonen kann.

Sie fragen, ob Sie das Repository kopieren oder symlinken, und Sie haben es sicherlich kopiert (geklont), wie Sie auch mit ls . Danach fügten Sie Mercurial einige Metadaten hinzu, die ihm sagen, wo es das Unterverzeichnis finden kann. Dies hat nichts mit einem symbolischen Link im Sinne des normalen Dateisystems zu tun, es sind nur einige Metadaten für Mercurial.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X