2009-01-19 11 views
5

Wenn ich eine SVN-Kopie mit zwei URLs zu tun, erhalte ich eine ‚billige‘ Kopie im Repository ...Ist SVN-Kopie billig, wenn nicht im Repository gemacht?

svn copy http://repo_url/trunk http://repo_url/tags/release_foo 

Aber was, wenn die Kopie im Arbeitsverzeichnis zu tun und dann es so begehen .. .

svn copy trunk tags/release_foo 
svn commit tags/release_foo 

Die Kopie erstellt lokale Kopien der Dateien, die automatisch svn hinzugefügt werden. Sie gehen nur in das Repository, wenn sie ausgeführt werden.

Die Beispiele in der Doco scheinen immer die url zu URL-Kopie zum Taggen oder Verzweigen verwenden, aber ich konnte nichts finden, das explizit besagt, dass Sie nicht WC zu WC gefolgt von einem Commit verwenden sollten.

Sind also diese beiden Methoden gleich? Erstellen beide eine billige Kopie im Repository?

Antwort

4

Ich glaube, dass eine URL-Kopie und eine WC-Kopie ziemlich genau das Gleiche sind, wenn es darum geht, "billig" zu sein. In Ihrem WC ist jede Kopie, die erstellt wird, keine Kopie wie das Kopieren einer Datei in einem Dateisystem.

svn ist intelligent, da es im Grunde einige weiche Links vom Ursprung zu Ihrem neuen Tag, Zweig oder was auch immer erstellt.

+0

Kopieren ohne Änderungen ist immer eine billige Operation. (Server/wc <-> Server/WC). Die Änderungen nehmen den Raum ein. –

+0

Was genau bedeutet es, wenn eine Aktion "billig" ist? Ist es eine schlimme Aktion? Wenn ja, was ist die empfohlene Methode zum Markieren und/oder Verzweigen mit SVN? – Dave

+0

@Dave: In diesem Fall ist die Aktion in Bezug auf Prozessorleistung und Speicherplatz billig (d. H. Es verwendet nicht viel von jedem, was eine gute Sache ist). Dies liegt daran, dass SVN nur die Informationen speichert, die angeben, dass eine Kopie stattgefunden hat, und nicht die tatsächlich kopierten Dateien/Ordner. – rmeador

1

Tun Sie dies nicht tun:

svn merge <local copy>/branch <local copy>/trunk 

Ihre Befehle wie diese, kann in ähnlicher Weise lästig sein:

svn copy trunk tags/release_foo 
svn commit tags/release_foo 

Während in einem lokalen Arbeitskopie Kopieren ist in Ordnung, aber diese Befehle lassen es so aussehen als hätten Sie das gesamte Repository in einer einzigen Arbeitskopie ausgecheckt. Ich hatte jemanden, der das machte und wir mussten den Stamm löschen und von einer vorherigen Revision kopieren. Unerinnert erinnere ich mich nicht an die Details, die uns in diese Ecke boxten. Ich erinnere mich, dass die Dinge sehr schnell nach Süden gehen, wenn Sie versuchen, Zusammenführungen zwischen Zweigen in "lokalen" Verzeichnissen durchzuführen.

Verwenden Sie Repository-URLs immer zum Erstellen/Verwalten/Zusammenführen von Tags und Verzweigungen. Es ist sicherer. Es garantiert, dass Ihre Arbeitskopie nicht veraltet ist, um das Tag/den Zweig zu erstellen, und garantiert auch, dass die Erstellung transaktional ist.

Ich denke, das Problem wie das passieren kann:

  1. Person A aktualisiert ihre Masse alles Arbeitskopie
  2. Person A einige Tags macht, hat einige Zweige, hat einige verschmilzt, aber nicht begangen hat, noch.
  3. Person B legt einige Änderungen an der Quelle dieser Tags fest, oder an der Verzweigung, die zusammengeführt wurde.
  4. Person A versucht zu begehen und svn wird sie nicht zulassen.

Wieder war es eine Reihe von Jahren, also erinnere ich mich nicht an die Einzelheiten, aber es gibt nicht wirklich einen guten Grund, Ihre Arbeitskopie so einzustellen.

+0

Es ist völlig in Ordnung, Dateien/Ordner in einer Arbeitskopie zu kopieren. Wenn Sie Probleme hatten, handelt es sich eindeutig um PIBCAC. Außerdem können Sie in SVN nur in eine lokale Arbeitskopie einbinden. –

+0

Ich habe bearbeitet, um zu klären, was ich meine. Ja, es war PIBCAC. In diesem Fall hatte die Person den gesamten Subversionsbaum ausgecheckt, anstatt Stamm oder Zweig, den er wollte, weil "es einfacher war". Es mist auch wirklich Dinge. – Otto

+0

"Auch in SVN können Sie nur in eine lokale Arbeitskopie zusammenführen." ... richtig, er hat versucht, eine lokale Arbeitskopie in dieselbe lokale Arbeitskopie einzubinden. – Otto

5

Wenn Sie die Kopie lokal ausführen, werden Sie natürlich durch das Kopieren der Dateien auf Ihrem lokalen Rechner (Ihr lokales Dateisystem weiß nichts über SVN-Deltas) viel Platz und Zeit kosten, aber wenn Sie zum Commit gehen, werden Sie sollte sehen, dass nur der Stamm der kopierten Verzeichnisstruktur als hinzugefügt (mit Historie) aufgelistet ist. Dadurch wird beim Commit die "billige" Kopie auf dem Server erstellt.

Das heißt, die URL-Kopiermethode wird im Allgemeinen für die Verzweigung oder Markierung bevorzugt, da es nicht erforderlich ist, dass Sie den Repository-Stamm ausgecheckt haben (einschließlich aller Zweige und Tags - das wäre riesig!). Der normale Anwendungsfall besteht darin, serverseitig zu verzweigen/zu markieren (unter Verwendung der URL-Kopie) und dann die Zweige/Tags nach Bedarf für Ihre Arbeit auszuchecken.

Wenn Sie aus irgendeinem Grund nur eine Datei oder einen Ordner in Ihrer Arbeitskopie kopieren (sagen Sie, Sie brechen eine Klassendatei in zwei Teile und möchten den gemeinsamen Verlauf beibehalten), dann verwenden Sie einfach svn copy in Ihrem WC.

+0

Dies ist die prägnantere Version des Punktes, den ich versuche zu machen, außer "allgemein bevorzugt" bedeutet "du könntest wirklich Dinge verschweißen". :) – Otto

Verwandte Themen