Frage

Ich bin neu in SVN so könnte dies eine einfache Frage sein.

Wir haben einen „Stamm“ mit 1. Ebene Verzeichnisse:

10 <-- documents
20 <-- source code, db scripts, ...
30 <-- documents
40 <-- referenced 3rd party library-es

Ich habe einen „entwickeln“ Zweig vom „Stamm“. In „entwickeln“ wir unseren Quellcode ändern und es nach dem Testen wir fusionieren es zu „Stamm“.

Das Problem, dass in den Verzeichnissen „10“ und „30“ * .doc-Dateien gespeichert werden, das nicht für die Entwicklung benötigt werden, so ist es erforderlich, dass „entwickeln“ Zweig nicht diese Verzeichnisse hat.

Die Lösung soll nach wie vor:

  1. erlauben "svn update" auf Stammordner "entwickeln" Arbeitskopie (20 und 40)
  2. das Update sollte nicht neu erstellen 10 Verzeichnisse und 30 und
  3. natürlich "entwickeln" auf "Stamm" sollte nicht gelöscht werden 10 oder 30 in "trunk" verschmilzt.

EDIT: Ich vergaß zu erwähnen, dass „Quellcode“ in 20. Es ist nicht nur referenziert dll-s und Build-Skripte etc., die auch im 1. Level-Verzeichnis sind, können 40 sagen.

War es hilfreich?

Lösung

Wenn ich Ihre Frage richtig gelesen, das ist einfach eine Frage der SVN-Kopie nur mit den gewünschten Verzeichnisse in einen Zweig zu kopieren - im Grunde eine Kombination von Antworten von Mike Kushner und Ivan Krechetov . Ich denke aber, könnte es einfacher sein, nach dem Laufen durch die einzelnen Schritte zu verstehen, sich selbst, so dass der Rest dieses Beitrags wird ein Beispiel-Repository und zeigen die Kopien und verschmilzt erstellen.

Ich gehe davon aus, dass Sie das "Standard" Repository-Layout verwenden, die auf der obersten Ebene hat drei Unterverzeichnisse, Stamm Zweige , und -Tags . Und dass Ihre 10 20 30 und 40 Verzeichnisse sind unter Stamm. Mit anderen Worten:

trunk
    10
    20
    30
    40
branches
tags

Und wie Mike wies darauf hin, Ihr Ziel wird es sein, eine Struktur zu haben, die wie folgt aussieht:

trunk
    10
    20
    30
    40
branches
    sandbox
        20
        40
tags

Es ist unklar, von Kommentar verfassen (zumindest als-der aktuellen Bearbeitung), aber Sie können eine Verzeichnisstruktur aufweisen, in der 10 20 , et al sind die oberste Ebene. In diesem Fall müssen Sie eine neue Top-Level-Verzeichnis erstellen, die ich nenne dev , so dass Ihre gesamte Repository sieht wie folgt aus:

10
20
30
40
dev
    20
    40

Beachten Sie, dass Sie nicht erstellen können dev unter 20 . Nun, körperlich können Sie, aber Sie sind fast garantiert, um Ihren Build zu brechen, wenn dies zu tun.

OK, also lassen Sie sich durch ein Beispiel zu Fuß, in der wir ein neues Repository erstellen und einige Dateien in ihnen. Sie müssen in der Lage, die svnadmin Befehl (die Sie sollten in der Lage sein zu tun, wenn Sie einen paranoiden Sysadmin haben) laufen zu lassen. So wählen Sie ein temporäres Verzeichnis, und führen Sie folgende Befehle (ich bin Linux laufen, wenn Sie Windows ausführen Befehle werden die gleiche sein, aber Sie werden einen speziellen Windows-Pfad in dem REPO Variable setzen müssen):

svnadmin create temp.repo
REPO="file://`pwd`/temp.repo"
svn co $REPO temp

Dies schafft eine neue (leere) Repository und prüft eine Arbeitskopie davon aus. Die zweite Zeile muss eine Erklärung: Es wird lediglich die Repository-URL aus dem aktuellen Verzeichnis. In meinem Arbeitsbereich Verzeichnis, sieht die URL wie folgt aus:

file:///home/kgregory/Workspace/temp.repo

OK, jetzt, dass Sie eine Arbeitskopie haben, lassen Sie uns die Probe Verzeichnisstruktur erstellen und einige Dateien:

cd temp
svn mkdir trunk
svn mkdir branches
svn mkdir tags
svn commit -m "standard repo structure"

pushd trunk
svn mkdir 10
svn mkdir 20
svn mkdir 30
svn mkdir 40
svn commit -m "example sub-project structure"

echo "this doesn't change" > 10/dontchange.txt
svn add 10/dontchange.txt
echo "this does change" > 20/change.txt
svn add 20/change.txt
svn status
svn commit -m "example files"
popd

An diesem Punkt haben wir die Probe Verzeichnisse und zwei Dateien in ihnen. Hier ist die Ausgabe von finden , ohne Subversion versteckte Verzeichnisse:

temp, 531> find . | grep -v svn
.
./tags
./trunk
./trunk/10
./trunk/10/dontchange.txt
./trunk/30
./trunk/20
./trunk/20/change.txt
./trunk/40
./branches

Der nächste Schritt ist die Sandbox-Verzeichnis zu erstellen, und Kopien der beiden Verzeichnisse, die darin sein werden:

svn mkdir branches/sandbox
pushd branches/sandbox
svn copy ${REPO}/trunk/20 .
svn copy ${REPO}/trunk/40 .
svn commit -m "make development branch"
popd

Dies ist der wichtige Teil: Ich habe den Zweig und Kopien in meinem Arbeitsverzeichnis, als Kopie aus dem Repository zu schaffen. Normalerweise kopieren Sie nur trunk in ein Kind von branches, mit svn copy mit zwei Repository Argumente. Das funktioniert hier nicht, weil wir nur zwei Kinder von trunk wollen.

Dieses Nachdem ich meine Arbeitskopie sieht wie folgt aus:

temp, 539> find . | grep -v svn
.
./tags
./trunk
./trunk/10
./trunk/10/dontchange.txt
./trunk/30
./trunk/20
./trunk/20/change.txt
./trunk/40
./branches
./branches/sandbox
./branches/sandbox/20
./branches/sandbox/20/change.txt
./branches/sandbox/40

An diesem Punkt werden Sie normalerweise den Entwicklungszweig in ein neues Arbeitsverzeichnis überprüfen und dort arbeiten. Also werde ich tun, dass (nach einer cd zurück zu meinem Arbeitsbereich-Verzeichnis):

svn co ${REPO}/branches/sandbox sandbox
cd sandbox

Und nun einige Änderungen vornehmen:

vi 20/change.txt
svn commit -m "changed on branch"

OK, jetzt ist es Zeit, den Kofferraum zu verschmelzen zurück. So in den Arbeitsbereich zurückgehen, und schauen Sie sich einfach den Stamm:

svn co ${REPO}/trunk trunk
cd trunk

Und aus dem Sandbox verschmelzen. Der Vereinigungsprozess wird in der beschrieben Subversion docs :

svn merge -r 4:5 ${REPO}/branches/sandbox
svn status

Der letzte Befehl sollte zeigen, dass nur die Datei 20/change.txt durch die Zusammenführung betroffen war. Da Sie nicht die 10 oder 30 Verzeichnisse in den Zweig kopiert haben, werden sie nicht von der Zusammenführung berührt werden.

Andere Tipps

Was Sie tun möchten, ist eine Kopie von „20“ erstellen irgendwo in Ihrem SVN-Baum, den Sie hin und her mit verschmelzen können. Eine gemeinsame Struktur ist

repo
---> trunk
    ---> 10 
    ---> 20
    ---> 30
---> branches
    ---> sandboxes
        ---> develop <branch of 20>
---> tags

Wenn Sie aktualisieren möchten, „entwickeln“, Sie entweder einen neuen Zweig der „20“ unter Sandkästen erstellen oder eine Zusammenführung von 20 zu entwickeln, durchzuführen. Wenn Sie die Änderungen in „entwickeln“ zurück in Ihrem Stamm wollen fusionieren Sie in die andere Richtung. Ihre Entwickler sollten eine Kopie von „entwickeln“ Check-out (oder ihre eigenen Niederlassungen schaffen, basierend auf „entwickeln“)

afaik Sie es mit der Repository-Struktur nicht tun können Sie im Moment haben.

Ich schlage vor, Sie Ihren Repository neu strukturieren, also 10 & 20, 40 & die anderen Code bezogenen Vermögenswerte werden unter einem neuen 1. Ebene-Ordnern verschoben. So können Sie diese Situation vermeiden, und zu vereinfachen, nur der Code bezogenen Vermögenswerten in der Lage zu ergreifen.

Im Idealfall sollten Sie auf einem niedrigeren Niveau verzweigen. d.h. Zweig 20 nicht Stamm. Auf diese Weise Sie Verzweigung nur die Inhalte, die verzweigt sein sollte. das heißt, dass Sie verzweigt werden sollen.

Sie können das, indem sie erreichen nur den Quellcode Unterverzeichnis Ihrer Arbeitskopie Punkt seiner Branche.

svn cp http://example.com/svnrepo/trunk/source_code http://example.com/svnrepo/branches/development/source_code

cd ./source_code
svn sw http://example.com/svnrepo/branches/development/source_code

, um die Änderungen durchführen, begehen. Dann lassen Sie sich mit dem Stamm zusammenführen:

svn sw http://example.com/svnrepo/trunk/source_code
cd ..
svn merge -r [start_rev]:HEAD http://example.com/svnrepo/branches/development/source_code ./source_code

Überprüfen, um sicherzustellen, ist alles in Ordnung:

svn diff | less

Und dann begehen. Fertig.

Wir tun etwas wie folgt aus:

-repo: Assemblies
--SomeAssembly
---Current
---v1.0
---v1.1
-repo: Source
--trunk
---Code
---Assemblies (external from Assemblies repo)
--branches
---v1.0
----Code
----Assemblies (external from Assemblies repo)
--Documents

In diesem Beispiel sind die dritte Partei Baugruppen haben ihre eigenen Repository. So können Sie pflegen nicht verschiedene Versionen in jedem Zweig und Rumpf. Als Randnotiz ist die neueste Version einer Versammlung in den „Current“ Ordner für jede Baugruppe dupliziert. Dies ermöglicht die Montage ohne aktualisiert werden Referenzen in allen Projekten zu aktualisieren. Dies kann kein Problem in Ihrer Domäne, aber es war ein großer Schmerz in uns.

Beachten Sie auch, dass die Dokumente auf der gleichen Ebene in der Hierarchie als Stamm und die Äste. Auf diese Weise diese Dateien werden nicht dupliziert. Wenn dies nicht möglich ist, kann diese ebenfalls externaled werden, was sie in Stamm und Ästen sein würde ermöglichen, ohne getrennt zu werden Quelle gesteuert.

Wie Sie Ihr Projekt strukturieren, zusammen mit der Richt Einschränkungen docs, paßt nicht mit SVN Modell aus der Box.

Einige Ideen:

  • Bewegen Sie die docs dir außerhalb Stamm, und fügen Sie es als svn:external
  • Bewegen Sie die docs dir außerhalb Stamm und haben ein Build-Skript Stamm kombinieren und die docs dir
  • Merge ein Skript verwenden (anstelle einer direkten svn merge) und haben das Skript die Regeln erzwingen

Von Ihrem Kommentar:

  

Wir wollen in 10 Modifikation von Dokumenten verhindern und 30. Sie sollen nur im Kofferraum geändert werden.

Haben Sie mit in Betracht gezogen svn: externals im develop Zweig für 10 und 30? Relative Referenzierung von root ^ / wäre wahrscheinlich ein guter Ansatz sein.

Während also 10, 20, 30 und 40 würden auf dem Zweig zugänglich sein, 10 und 30 sind noch vom Stamm verwiesen. Anschließend können Sie Ihre Genehmigung rel="nofollow nach Bedarf benötigt.

  

Repo
  ..-> Stamm
  ....-> 10
  ....-> 20
  ....-> 30
  ....-> 40
  ..-> Zweige
  ....-> entwickeln
  ......-> 10 (Leben am Stamm, svn: externals ^ / trunk / 10)
  ......-> 20 (lebt auf einem Ast, fusionieren zu Stamm)
  ......-> 30 (Leben am Stamm, svn: externals ^ / trunk / 30)
  ......-> 40 (lebt auf einem Ast, fusionieren zu Stamm)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top