Wie benutzt man SVN, Branch? Etikett? Kofferraum?


163

Ich habe ein bisschen gegoogelt und konnte keinen guten "Anfänger" -Ratgeber für SVN finden , nicht im Sinne von "Wie verwende ich die Befehle?". Wie steuere ich meinen Quellcode?

Was ich klären möchte, sind die folgenden Themen:

  • Wie oft verpflichten Sie sich? So oft wie man Ctrl+ drücken würde s?
  • Was ist ein Zweig und was ist ein Tag und wie steuern Sie sie?
  • Was geht in die SVN? Nur Quellcode oder teilen Sie hier auch andere Dateien? (Nicht als versionierte Dateien betrachtet ..)

Ich habe keine Ahnung, was Zweig und Tag sind, daher kenne ich den Zweck nicht, aber meine wilde Vermutung ist, dass Sie Dinge in den Trunk hochladen und wenn Sie einen größeren Build ausführen, verschieben Sie ihn in den Zweig? Was wird in diesem Fall als wichtiger Build angesehen?


Ein guter Weg, um eine Commit-Häufigkeit zu bestimmen, besteht darin, sie unter dem Gesichtspunkt der Zusammenführung zu betrachten. Wenn Sie einen Zweig hatten, in dem Sie Änderungen von Trunk zu Trunk zusammenführen mussten, hilft Ihnen das Durchblättern einer Handvoll Revisionen von Vs 1000 bald, einen vernünftigen Ansatz zu finden.
Phil Cooper

Antworten:



86

Ich habe mir die gleichen Fragen gestellt, als wir Subversion hier implementierten - ungefähr 20 Entwickler, verteilt auf 4 - 6 Projekte. Ich habe keine gute Quelle mit der Antwort gefunden. Hier sind einige Teile, wie sich unsere Antwort in den letzten 3 Jahren entwickelt hat:

- so oft wie nötig verpflichten; Unsere Faustregel lautet: Festschreiben, wenn Sie genügend Arbeit geleistet haben, sodass es ein Problem wäre, diese erneut ausführen zu müssen, wenn die Änderungen verloren gehen. manchmal verpflichte ich mich alle 15 Minuten oder so, manchmal kann es Tage sein (ja, manchmal brauche ich einen Tag, um 1 Codezeile zu schreiben)

- Wir verwenden Zweige, wie in einer Ihrer früheren Antworten vorgeschlagen, für verschiedene Entwicklungspfade. Derzeit haben wir für eines unserer Programme drei aktive Zweige: 1 für die Hauptentwicklung, 1 für den noch nicht abgeschlossenen Versuch, das Programm zu parallelisieren, und 1 für den Versuch, es für die Verwendung von XML-Eingabe- und Ausgabedateien zu überarbeiten;

- Wir verwenden kaum Tags, obwohl wir der Meinung sind, dass wir sie verwenden sollten, um Veröffentlichungen für die Produktion zu identifizieren.

Stellen Sie sich die Entwicklung auf einem einzigen Weg vor. Zu einem bestimmten Zeitpunkt oder in einem Entwicklungsstadium beschließt das Marketing, die erste Version des Produkts freizugeben, sodass Sie eine Markierung in den Pfad mit der Bezeichnung "1" (oder "1.0" oder was haben Sie) setzen. Zu einem anderen Zeitpunkt beschließt ein heller Funke, das Programm zu parallelisieren, entscheidet jedoch, dass dies Wochen dauern wird und dass die Leute in der Zwischenzeit den Hauptweg weitergehen wollen. Sie bauen also eine Weggabelung und verschiedene Leute wandern die verschiedenen Gabeln hinunter.

Die Flaggen auf der Straße werden als "Tags" bezeichnet, und an den Gabeln auf der Straße teilen sich die "Zweige". Gelegentlich kommen auch Zweige wieder zusammen.

- Wir stellen alles Material, das zum Erstellen einer ausführbaren Datei (oder eines Systems) erforderlich ist, in das Repository. Das bedeutet mindestens Quellcode und Make-Datei (oder Projektdateien für Visual Studio). Aber wenn wir Symbole und Konfigurationsdateien und all das andere Zeug haben, geht das in das Repository. Einige Dokumentationen finden ihren Weg in das Repo; Sicherlich ist jede Dokumentation wie Hilfedateien, die möglicherweise in das Programm integriert sind, vorhanden, und es ist ein nützlicher Ort, um Entwicklerdokumentation zu platzieren.

Wir haben sogar ausführbare Windows-Dateien für unsere Produktionsversionen dort abgelegt, um Menschen, die nach Software suchen, einen einzigen Speicherort zu bieten. Unsere Linux-Versionen werden auf einen Server übertragen und müssen nicht gespeichert werden.

- Wir verlangen nicht, dass das Repository jederzeit in der Lage ist, eine neueste Version bereitzustellen, die erstellt und ausgeführt wird. Einige Projekte funktionieren so, andere nicht. Die Entscheidung liegt beim Projektmanager und hängt von vielen Faktoren ab, aber ich denke, sie bricht zusammen, wenn größere Änderungen an einem Programm vorgenommen werden.


18
* How often do you commit? As often as one would press ctrl + s?

So oft es geht. Code existiert nur, wenn er unter Quellcodeverwaltung steht :)

Durch häufige Festschreibungen (danach kleinere Änderungssätze) können Sie Ihre Änderungen einfach integrieren und die Wahrscheinlichkeit erhöhen, dass etwas nicht beschädigt wird.

Andere Leute haben angemerkt, dass Sie ein Commit durchführen sollten, wenn Sie über einen funktionierenden Code verfügen. Ich finde es jedoch nützlich, etwas häufiger ein Commit durchzuführen. Einige Male bemerkte ich, dass ich die Quellcodeverwaltung als schnellen Rückgängig- / Wiederherstellungsmechanismus verwende.

Wenn ich in meinem eigenen Zweig arbeite, ziehe ich es vor, so viel wie möglich zu verpflichten (buchstäblich so oft, wie ich Strg + s drücke).

* What is a Branch and what is a Tag and how do you control them?

Lesen Sie das SVN-Buch - es ist ein Ort, mit dem Sie beginnen sollten, wenn Sie SVN lernen:

* What goes into the SVN?

Dokumentation, kleine Binärdateien, die für die Erstellung erforderlich sind, und andere Dinge, die einen gewissen Wert haben, gehen zur Quellcodeverwaltung.


11

Im Folgenden finden Sie einige Ressourcen zur Häufigkeit des Festschreibens, zu Festschreibungsnachrichten, zur Projektstruktur, zur Quellcodeverwaltung und zu anderen allgemeinen Richtlinien:

Diese Fragen zum Stapelüberlauf enthalten auch einige nützliche Informationen, die von Interesse sein können:

In Bezug auf die grundlegenden Subversion-Konzepte wie Verzweigung und Tagging denke ich, dass dies im Subversion-Buch sehr gut erklärt wird .

Wie Sie vielleicht feststellen werden, nachdem Sie etwas mehr über das Thema gelesen haben, sind die Meinungen der Menschen zu den besten Praktiken in diesem Bereich oft unterschiedlich und manchmal widersprüchlich. Ich denke, die beste Option für Sie ist, zu lesen, was andere Leute tun, und die Richtlinien und Praktiken auszuwählen, die Ihrer Meinung nach für Sie am sinnvollsten sind.

Ich halte es nicht für eine gute Idee, eine Praxis anzuwenden, wenn Sie den Zweck nicht verstehen oder den dahinter stehenden Gründen nicht zustimmen. Befolgen Sie also keine Ratschläge blind, sondern entscheiden Sie sich selbst, was Ihrer Meinung nach am besten für Sie funktioniert. Das Experimentieren mit verschiedenen Methoden ist auch eine gute Möglichkeit, um zu lernen und herauszufinden, wie Sie am liebsten arbeiten. Ein gutes Beispiel hierfür ist die Strukturierung des Repositorys. Es gibt keinen richtigen oder falschen Weg, und es ist oft schwer zu wissen, welchen Weg Sie bevorzugen, bis Sie sie tatsächlich in der Praxis ausprobiert haben.


8

Die Häufigkeit des Festschreibens hängt von Ihrem Projektmanagementstil ab. Viele Leute verzichten darauf, sich zu verpflichten, wenn dadurch der Build (oder die Funktionalität) beschädigt wird.

Zweige können auf zwei Arten verwendet werden, normalerweise: 1) Ein aktiver Zweig für die Entwicklung (und der Trunk bleibt stabil) oder 2) Zweige für alternative Entwicklungspfade.

Tags werden im Allgemeinen zur Identifizierung von Releases verwendet, damit sie nicht im Mix verloren gehen. Die Definition von "Release" liegt bei Ihnen.


Einverstanden: Commit, solange Sie den Build nicht brechen!
Brandon Montgomery

7

Ich denke, das Hauptproblem ist, dass das mentale Bild der Quellcodeverwaltung verwirrt ist. Wir haben normalerweise Stamm und Zweige, aber dann bekommen wir nicht verwandte Ideen von Tags / Releases oder etwas Ähnlichem.

Wenn Sie die Idee eines Baumes vollständiger verwenden, wird es klarer, zumindest für mich.

Wir bekommen den Stamm -> bildet Zweige -> produzieren Obst (Tags / Releases).

Die Idee ist, dass Sie das Projekt aus einem Stamm erweitern, der dann Zweige erstellt, sobald der Stamm stabil genug ist, um den Zweig zu halten. Wenn der Zweig eine Frucht hervorgebracht hat, pflücken Sie sie vom Zweig und geben sie als Etikett frei.

Tags sind im Wesentlichen Liefergegenstände. Während Stamm und Zweige sie produzieren.


4

Wie andere bereits gesagt haben, ist das SVN-Buch der beste Ausgangspunkt und eine gute Referenz, sobald Sie Ihre Seebeine bekommen haben. Nun zu Ihren Fragen ...

Wie oft verpflichten Sie sich? So oft wie man Strg + s drücken würde?

Oft, aber nicht so oft, wie Sie Strg + s drücken. Es ist eine Frage des persönlichen Geschmacks und / oder der Teampolitik. Persönlich würde ich Commit sagen, wenn Sie einen funktionalen Code vervollständigen, egal wie klein er ist.

Was ist ein Zweig und was ist ein Tag und wie steuern Sie sie?

Erstens ist Trunk der Ort, an dem Sie Ihre aktive Entwicklung durchführen. Es ist die Hauptzeile Ihres Codes. Ein Zweig ist eine Abweichung von der Hauptlinie. Dies kann eine große Abweichung sein, wie in einer früheren Version, oder nur eine kleine Änderung, die Sie ausprobieren möchten. Ein Tag ist eine Momentaufnahme Ihres Codes. Auf diese Weise können Sie einer bestimmten Revision ein Etikett oder ein Lesezeichen hinzufügen.

Erwähnenswert ist auch, dass bei Subversion Trunk, Zweige und Tags nur Konventionen sind. Nichts hindert Sie daran, in Tags zu arbeiten oder Zweige zu haben, die Ihre Hauptlinie sind, oder das Tag-Branch-Trunk-Schema insgesamt zu ignorieren. Aber wenn Sie keinen guten Grund haben, halten Sie sich am besten an die Konvention.

Was geht in die SVN? Nur Quellcode oder teilen Sie hier auch andere Dateien?

Auch eine persönliche oder Teamwahl. Ich ziehe es vor, alles, was mit dem Build zu tun hat, in meinem Repository zu behalten. Dazu gehören Konfigurationsdateien, Build-Skripte, zugehörige Mediendateien, Dokumente usw. Sie sollten keine Dateien einchecken, die auf dem Computer jedes Entwicklers unterschiedlich sein müssen. Sie müssen auch keine Nebenprodukte Ihres Codes einchecken. Ich denke hauptsächlich an Build-Ordner, Objektdateien und dergleichen.


Oft, aber nicht so oft, wie Sie Strg + s drücken. Einverstanden. Sie müssen wahrscheinlich Ihre Änderungen speichern, um die Auswirkungen zu sehen. Ich mache das wahrscheinlich 10 Mal und baue nach und nach Code auf, bevor ich etwas habe, das ich festschreiben kann, und einen aussagekräftigen Kommentar zu dem, was ich getan habe. Anders ausgedrückt, ich möchte, dass meine Kommentare "diese Funktion hinzugefügt" oder "diesen Fehler behoben" lauten und nicht "in ein paar Zeilen herumstöbern, nicht sicher, wie dies funktionieren wird". Also begebe ich vielleicht ein halbes Dutzend Mal am Tag.
Nathan Long

4

Eric Sink, der im Januar 2009 im SO-Podcast Nr. 36 erschien, schrieb eine hervorragende Artikelserie unter dem Titel Source Control How-to .

(Eric ist der Gründer von SourceGear, der eine Plug-kompatible Version von SourceSafe vermarktet, aber ohne die Schrecklichkeit.)


4

Nur um weitere Antworten hinzuzufügen:

  • Ich verpflichte mich, wann immer ich eine Arbeit beende. Manchmal ist es ein winziger Bugfix, der nur eine Zeile geändert hat und für den ich 2 Minuten gebraucht habe. ein anderes Mal ist es zwei Wochen Schweiß wert. Als Faustregel gilt auch, dass Sie nichts festschreiben, was den Build unterbricht. Wenn Sie also lange gebraucht haben, um etwas zu tun, nehmen Sie vor dem Festschreiben die neueste Version und prüfen Sie, ob Ihre Änderungen den Build beschädigen. Wenn ich lange Zeit ohne Verpflichtung unterwegs bin, fühle ich mich natürlich unwohl, weil ich diese Arbeit nicht verlieren möchte. In TFS verwende ich dieses schöne Ding als "Regale" dafür. In SVN müssen Sie auf andere Weise umgehen. Erstellen Sie möglicherweise einen eigenen Zweig oder sichern Sie diese Dateien manuell auf einem anderen Computer.
  • Zweige sind Kopien Ihres gesamten Projekts. Das beste Beispiel für ihre Verwendung ist möglicherweise die Versionierung von Produkten. Stellen Sie sich vor, Sie arbeiten an einem großen Projekt (z. B. dem Linux-Kernel). Nach Monaten des Schweißes sind Sie endlich bei Version 1.0 angekommen, die Sie der Öffentlichkeit zugänglich machen. Danach beginnen Sie mit der Arbeit an Version 2.0 Ihres Produkts, die viel besser sein wird. In der Zwischenzeit gibt es aber auch viele Leute, die Version 1.0 verwenden. Und diese Leute finden Fehler, die Sie beheben müssen. Jetzt können Sie den Fehler in der kommenden Version 2.0 nicht beheben und an die Clients senden - er ist überhaupt nicht bereit. Stattdessen müssen Sie eine alte Kopie der 1.0-Quelle herausziehen, den Fehler dort beheben und diese an die Leute versenden. Dafür sind Zweige da. Als Sie die 1 freigegeben haben. 0 Version Sie haben einen Zweig in SVN erstellt, der zu diesem Zeitpunkt eine Kopie des Quellcodes erstellt hat. Dieser Zweig wurde "1.0" genannt. Sie haben dann die Arbeit an der nächsten Version in Ihrer Hauptquellkopie fortgesetzt, aber die 1.0-Kopie blieb dort wie zum Zeitpunkt der Veröffentlichung. Und Sie können dort weiterhin Fehler beheben. Tags sind nur Namen, die zur Vereinfachung der Verwendung bestimmten Revisionen zugeordnet sind. Sie könnten "Revision 2342 des Quellcodes" sagen, aber es ist einfacher, ihn als "Erste stabile Revision" zu bezeichnen. :) :)
  • Normalerweise stelle ich alles in die Quellcodeverwaltung, was sich direkt auf die Programmierung bezieht. Da ich beispielsweise Webseiten erstelle, stelle ich auch Bilder und CSS-Dateien in die Quellcodeverwaltung, ganz zu schweigen von Konfigurationsdateien usw. Die Projektdokumentation wird dort nicht aufgenommen, dies ist jedoch eigentlich nur eine Frage der Präferenz.

3

Andere haben angegeben, dass es von Ihrem Stil abhängt.

Die große Frage für Sie ist, wie oft Sie Ihre Software "integrieren". Testgetriebene Entwicklung, Agile und Scrum (und viele, viele andere) basieren auf kleinen Änderungen und kontinuierlicher Integration. Sie predigen, dass kleine Änderungen vorgenommen werden, jeder findet die Pausen und repariert sie ständig.

Bei einem größeren Projekt (denken Sie an Regierung, Verteidigung, 100.000 + LOC) können Sie jedoch keine kontinuierliche Integration verwenden, da dies nicht möglich ist. In diesen Situationen ist es möglicherweise besser, die Verzweigung zu verwenden, um viele kleine Commits durchzuführen, aber NUR das in den Trunk zurückzubringen, was funktioniert und bereit ist, in den Build integriert zu werden.

Eine Einschränkung bei der Verzweigung ist jedoch, dass es ein Albtraum in Ihrem Repository sein kann, Arbeit in den Trunk zu bringen, wenn sie nicht ordnungsgemäß verwaltet werden, da sich jeder an verschiedenen Stellen im Trunk entwickelt (was übrigens eines der größten Argumente dafür ist kontinuierliche Integration).

Es gibt keine endgültige Antwort auf diese Frage. Der beste Weg ist, mit Ihrem Team zusammenzuarbeiten, um die beste Kompromisslösung zu finden.



1

Zum Festschreiben verwende ich die folgenden Strategien:

  • so oft wie möglich begehen.

  • Jede Funktionsänderung / jeder Bugfix sollte ein eigenes Commit erhalten (nicht viele Dateien gleichzeitig festschreiben, da dadurch der Verlauf dieser Datei unklar wird - z. B. wenn ich ein Protokollierungsmodul und ein GUI-Modul unabhängig voneinander ändere und beide gleichzeitig festschreibe). Beide Änderungen sind in beiden Dateiversionen sichtbar. Dies erschwert das Lesen eines Dateiversionsverlaufs.

  • Brechen Sie den Build bei keinem Commit ab - es sollte möglich sein, eine beliebige Version des Repositorys abzurufen und zu erstellen.

Alle Dateien, die zum Erstellen und Ausführen der App erforderlich sind, sollten sich in SVN befinden. Testdateien und dergleichen sollten nicht, es sei denn, sie sind Teil der Komponententests.


Ihre Regeln 1 und 3 sind etwas widersprüchlich. Wenn jedoch eine größere Entwicklung für Feature-Zweige durchgeführt wird, könnte Regel 3 für kleinere Änderungen, bei denen Zweige zu viel des Guten wären, "Trunk nicht brechen" lauten.
Chris Charabaruk

1

Viele gute Kommentare hier, aber etwas, das nicht erwähnt wurde, sind Commit-Nachrichten. Diese sollten obligatorisch und aussagekräftig sein. Besonders beim Verzweigen / Zusammenführen. Auf diese Weise können Sie verfolgen, welche Änderungen für welche Fehlerfunktionen relevant sind.

Zum Beispiel wird svn commit . -m 'bug #201 fixed y2k bug in code'jedem, der sich die Geschichte ansieht, sagen, wofür diese Überarbeitung gedacht war.

Einige Bug-Tracking-Systeme (z. B. Trac) können im Repository nach diesen Nachrichten suchen und sie den Tickets zuordnen. Das macht es sehr einfach herauszufinden, welche Änderungen mit jedem Ticket verbunden sind.


1

Die Richtlinien bei unserer Arbeit lauten wie folgt (Multi-Entwickler-Team, das an einem objektorientierten Framework arbeitet):

  • Tägliches Update von SVN, um die Änderungen des Vortages zu erhalten

  • Verpflichten Sie sich täglich. Wenn Sie am nächsten Tag krank sind oder abwesend sind, kann jemand anderes problemlos die Stelle übernehmen, an der Sie aufgehört haben.

  • Legen Sie keinen Code fest, der irgendetwas kaputt macht, da dies Auswirkungen auf die anderen Entwickler hat.

  • Arbeiten Sie an kleinen Stücken und verpflichten Sie sich täglich MIT BEDEUTENDEN KOMMENTAREN!

  • Als Team: Behalten Sie eine Entwicklungsniederlassung bei und verschieben Sie den Pre-Release-Code (für die Qualitätssicherung) in eine Produktionsniederlassung. Dieser Zweig sollte immer nur voll funktionsfähigen Code haben.



0

Ich denke, es gibt zwei Möglichkeiten, Frequenz festzulegen:

  1. Commit sehr oft für jede implementierte Methode, kleinen Teil des Codes usw.
  2. Übernehmen Sie nur abgeschlossene Codeteile wie Module usw.

Ich bevorzuge das erste - weil die Verwendung des Versionsverwaltungssystems nicht nur für Projekte oder Unternehmen sehr nützlich ist, sondern vor allem für Entwickler. Für mich ist die beste Funktion, den gesamten Code zurückzusetzen, während die am besten zugewiesene Aufgabenimplementierung gesucht wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.