Hallo,
ich arbeite in einem kleinen Team (<10 Leute) und moechte den
Code-Wildwuchs mit einer Versionskontrolle einschraenken. Zur Auswahl
stehen SVN und GIT.
In der Vergangenheit habe ich viel mit SVN gearbeitet und kenne es
daher. In letzter Zeit scheint mir aber GIT in Mode zu kommen. Wenn man
nach Vergleichen googelt, zieht eigentlich immer SVN den kuerzeren.
Unterschiede, die GIT gegenueber SVN aufweist habe ich folgende gehoert:
- dezentrailisiert: GIT can ohne Serververbindung comitten, mergen
- Mergen soll viel einfacher sein (paralleles Arbeiten am Code, also
mergen, sollte nicht soo oft vorkommen)
- Komplizierter zu bedienen als SVN
Eingesetzt werden soll das repo zum Speichern von uC Code, der mit MPlab
generiert wurde. MPLab bietet out of the box SVN support, aber kein Git
wie ich gesehen habe. Ausserdem sollen dort Eagle Layouts und Visual
Studio Code gespeichert werden. Gerade bei Eagle waeren Erfahrungen mit
Versionskontrollen hilfreich, da habe ich keine.
Zu beachten ist auch, dass ich der einzige im Team bin, der schonmal mit
Versionskontrollen gearbeitet hat, die anderen kommen hauptsaechlich aus
der E-Technik oder auch Maschinenbau, ich will nicht, dass die
Einfuehrung daran scheitert, dass Git anfangs fuer die zu kompliziert
ist.
Jemand Erfahrungen im Einsatz primaer im Embedded Bereich?
Git.
Es ist ein bisschen knifflig in git reinzukommen, aber es ist einfach
viel durchdachter und moderner als svn und auf lange Sicht sicherlich
die bessere Wahl. Insbesondere stört an svn diese total fehlgeleitete
Design-Entscheidung, dass "commit" und "push" dasselbe sind... wie
falsch das ist, merkt man erst, wenn man von svn auf git wechselt und
eine Weile damit arbeitet ;)
Richtig, GIT ist in Mode gekommen. Mehr ist an GIT auch nicht dran,
außer dass sich ein paar Nerds über Funktionen ereifern, die die Welt
nicht braucht - wenn man nicht gerade einen Kernel baut.
Vergleich einfach mal die Clients für GIT und SVN. Das ist viel
wichtiger als das ein oder andere kleine feature. Tortoise SVN als SVN
Client für Windows ist sehr schön.
Ppp schrieb:> außer dass sich ein paar Nerds über Funktionen ereifern, die die Welt> nicht braucht - wenn man nicht gerade einen Kernel baut.
Ohne es bisher genutzt zu haben - momentan genau meine Meinung.
... schrieb:> Vergleich einfach mal die Clients für GIT und SVN. Das ist viel> wichtiger als das ein oder andere kleine feature. Tortoise SVN als SVN> Client für Windows ist sehr schön.
TortoiseSVN kenne ich, afaik gibt es auch TortoiseGIT...
Ich benutze sowohl GIT als auch SVN fast täglich.
SVN ist sicherlich einfacher zu erlernen und auch vom Aufbau her anfangs
intuitiver, wenn man noch nie mit Versionkontrollsystemen zu tun hatte.
Wo SVN allerdings schwächelt, ist die parallele Verwaltung von mehreren
Versionszweigen. Bei GIT kann man relativ einfach Änderungen von einem
Zweig in einem anderen nachpflegen, um z.B. einen Bugfix-Patch vom
Entwicklungszweig in den Produktionszweig zu übernehmen oder auch von
mehreren Entwickungszweigen Änderungen in den Hauptzweig zu mergen oder
Entwicklungszweige mit dem Hauptzweig zu aktualisieren. Das geht mit GIT
deutlich besser als mit SVN.
bobberjahn schrieb:> In der Vergangenheit habe ich viel mit SVN gearbeitet und kenne es> daher.> Zu beachten ist auch, dass ich der einzige im Team bin, der schonmal mit> Versionskontrollen gearbeitet hat,
Dann nimm SVN. So hat wenigstens einer den Durchblick und kann den
anderen den Weg weisen. Man kann zwar auch Git so verwenden wie SVN,
dann hat man aber keine Vorteile. Und um die Vorteile von Git wirklich
zu nutzen, sollte wenigstens einer schon einmal ein Projekt damit
gemacht haben. Oder er sollte eine Woche Zeit bekommen, sich außerhalb
des eigentlichen Projekts mit der Sache intensiv auseinanderzusetzen.
> Unterschiede, die GIT gegenueber SVN aufweist habe ich folgende gehoert:> - dezentrailisiert: GIT can ohne Serververbindung comitten, mergen
Das ist vor allem dann ein großer Vorteil, wenn die Software nicht nur
inhouse entwickelt wird, sondern auch vor Ort beim Kunden Änderungen
vorgenommen werden.
> - Mergen soll viel einfacher sein (paralleles Arbeiten am Code, also> mergen, sollte nicht soo oft vorkommen)
Nicht unbedingt einfacher, aber es gibt mehr Möglichkeiten. Das ist vor
allem dann von Bedeutung, wenn man mit stark verzweigten Repositories
arbeitet.
> - Komplizierter zu bedienen als SVN
Um das Gleiche zu tun wie mit SVN, ist die Bedienung ähnlich einfach,
oft heißen sogar die Befehle gleich. Manche Dinge gehen mit Git sogar
etwas einfacher, bspw. das Anlegen von Branches.
> Ausserdem sollen dort Eagle Layouts und Visual Studio Code gespeichert> werden. Gerade bei Eagle waeren Erfahrungen mit Versionskontrollen> hilfreich, da habe ich keine.
Verteiltes Entwickeln macht bei Eagle-Layouts und -Schaltplänen wenig
Sinn, da nicht vernünftig gemerget werden kann, es sei denn, du hast ein
Merge-Tool für Eagle-Dateien. Der Nutzen von SVN oder Git beschränkt
sich hier also darauf, eine (lineare) Chronologie der einzelnen
Entwicklungsstände zu haben und diese zentral auf einem Server zu
halten.
... schrieb:> Vergleich einfach mal die Clients für GIT und SVN. Das ist viel> wichtiger als das ein oder andere kleine feature. Tortoise SVN als SVN> Client für Windows ist sehr schön.
Erstaunlicherweise setzt unterdessen sogar MS auf git...
http://visualstudiogallery.msdn.microsoft.com/abafc7d6-dcaa-40f4-8a5e-d6724bdb980c
Trotzdem: Wenn du SVN kennst nimm SVN, du kannst noch immer später auf
GIT wechseln falls nötig. (laut deiner Beschreibung wird dir GIT keine
grossen Vorteile bringen)
mfg Andreas
Ppp schrieb:> Richtig, GIT ist in Mode gekommen.
Richtig.
> Mehr ist an GIT auch nicht dran,
Falsch.
Es würde kein Aufwand in die Entwicklung von Git gesteckt werden, wenn
SVN genau die gleichen Möglichkeiten bieten würde.
> außer dass sich ein paar Nerds über Funktionen ereifern, die die Welt> nicht braucht - wenn man nicht gerade einen Kernel baut.
Der Linux-Kernel war zwar der Anlass für die Entwicklung von Git, das
heißt aber nicht, dass dessen Vorteile nur bei der Entwicklung von
Linux-Kernels in Erscheinung treten. Ein großer Schwerpunkt bei Git
liegt sicher in der dezentralen Entwicklung, die bei kleineren Software-
firmen nicht so stark ausgeprägt sein mag.
Dezentralität kann aber auch anders aussehen:
Ein Beispiel habe ich oben schon genannt: Ich gehe zum Kunden, um vor
Ort etwas in Betrieb zu nehmen. Dann habe ich automatisch sämtliche
bisherige Versionen der Software mit dabei und kann nach Belieben neue
Testversionen (d.h. Branches) anlegen, die ich hinterher ohne Probleme
in das Repository auf dem zentralen Server einspielen kann. Ich kann
aber auch problemlos meine Änderungen einem Kollegen überspielen, der
ebenfalls mit unterwegs ist, ohne dass ich dazu den zentralen Server
benötige. Sollte ich am nächsten Tag Urlaub haben, kann der Kollege
seine wie meine Änderungen auf den zentralen Server einspielen.
Ich verwende Git auch gerne in privaten Softwareprojekten, wo ich der
einzige Entwickler bin. Trotzdem arbeite ich mit mindestens drei
Repositories, von denen eins auf dem Desktop-PC, eins auf dem Laptop
(wenn ich am Wochenende woanders bin) und eins auf dem USB-Stick (für
den Datentransport). Mit SVN ist das nicht so einfach, und ich würde
mich wahrscheinlich für ein einzelnes Repository auf dem USB-Stick
entscheiden. So ein USB-Stick geht aber gerne mal verloren, und damit
auch die gesamte Versionsgeschichte, sofern sie nicht regelmäßig
gebackupt wurde. Mit den drei parallelen Git-Repositories kann ich mir
sogar den Backup sparen. Und dafür muss ich nicht einmal undbedingt
einen Git-Server auf einem der Rechner aufsetzen
Alles in allem gesehen bietet mir Git eine unglaubliche Freiheit, weil
ich überall fast alles machen kann und mir keine große Strategie
überlegen muss, an welchem Ort ich ein zentrales Repository halte und
wann ich die einzelnen Repositories untereinander synchronisiere.
bobberjahn schrieb:> Zur Auswahl> stehen SVN und GIT.
Ggf. solltest du noch Mercurial (hg) in Erwägung ziehen: ist von den
Ideen her ähnlich wie git (haben gleiche Wurzeln). Teilweise finde
ich git aber einfach nur willkürlich anders als vorangegangene
VCSe, während hg da gerade von den Begrifflichkeiten noch stärker
an CVS oder SVN anlehnt. Manche Dinge in git scheinen schon sehr
typisch für die Arbeitsweise der Linux-Kernelentwickler zugeschnitten
worden zu sein. hg wird übrigens bei OpenSolaris eingesetzt, man
kann also damit durchaus auch eine OS-Entwicklung betreiben. ;-)
(Aber das kann man auch mit CVS oder SVN, schließlich gab es auch
ein Leben vor dem Tod, ähem, vor git.)
Verteilte VCSe haben natürlich auch Nachteile, die man gern ein wenig
unter den Tisch fallen lässt. Typischerweise schleppt man ein
komplettes Repository pro working copy mit sich rum. Für größere
Projekte wird das schnell platzhungrig. Nur so als Vergleich:
CVS: working copy braucht nur wenig mehr, als die eigentlichen Daten
benötigen
SVN: working copy braucht etwas mehr als doppelt so viel wie die
eigentlichen Daten, da ein vollständiger Backup des zuletzt
ausgecheckten Standes mitgeführt wird
git oder hg: working copy braucht Platz für die eigentlichen Daten
plus die des gesamten Repos
Im Umkehrschluss braucht man bei CVS für praktisch alle Aktionen
einen Zugriff auf den Server. Bei SVN gehen "diff" und "revert"
lokal, für den Rest braucht man den Server. Bei git oder hg geht
alles ohne Server, natürlich nur bis zu dem Stand, zu dem man
zuletzt das Repository synchronisiert hat.
Yalu X. schrieb:> Es würde kein Aufwand in die Entwicklung von Git gesteckt werden, wenn> SVN genau die gleichen Möglichkeiten bieten würde.
Naja, meines Wissens hat Linus Torvalds lange Zeit keinerlei VCS
für den Linux-Kernel benutzt, während andere Betriebssysteme schon
20 Jahre vorher für sowas eine Notwendigkeit sahen. Insofern nehme
ich ihm den VCS-Experten nicht ab, als der er von seinen Jüngern
gern dargestellt wird. Dass verteilte VCSe ihre Vorteile haben,
steht außer Frage, aber dass sie das allein seelig Machende sind,
halte ich für die allermeisten Projekte für an den Haaren herbei
gezogen.
Dafür kann git in wenigen Millisekunden die komplette History auflisten
oder durchsuchen, oder ohne Netzwerkverbindung sagen wer eine bestimmte
Zeile zuletzt modifiziert hat. Plus, man kann komplett offline arbeiten,
wenn man das mal will (zum Beispiel im Zug). Oh, oder der Server geht
mal nicht -- dann auch. Das klingt nach einer Kleinigkeit, aber wenn man
mal in der Situation ist, ist es überraschend nützlich. Nach meiner
persönlichen Meinung wiegt das den Nachteil mit der großen Dateigröße
locker auf. Für mein Projekt, was History bis zurück zu 2006 und viele
tausend Commits hat, sind die komplette Repository gerade mal ein paar
Dutzend MB. Plus, git hat eine --depth Option beim clone, was erlaubt
auch "shallow" clones einer Repository zu machen, die nicht die
komplette History enthalten, sondern nur n Commits (von diesen kann
allerdings unter bestimmten Umständen nicht gepusht werden).
Ein Problem mit der Größe der Repository kriegt man nur dann, wenn man
"un-diffbare", sich oft ändernde Inhalte versioniert, zum Beispiel den
aus den Quellen erzeugten Objektcode oder sich häufig ändernde Bilder.
Das sollte man aber sowieso nicht machen.
Oh, oder dies: Um einem Commit zu machen, muss ich nicht die
Änderungen der anderen Leute am Repo berücksichtigen. Das heißt, ich
kann meine Arbeit erstmal sichern, und mich dann in aller Ruhe damit
beschäftigen, sie mit den Änderungen der anderen zu mergen (indem ich
erst git commit und dann git pull benutze). Wenn dabei etwas schiefgeht,
kann ich jederzeit zu dem Punkt zurückkehren, bevor ich die Änderungen
der anderen mit hineingezogen habe. Bei svn ist das nicht so: Man hat
irgendetwas fertig und möchte es commiten, und dann hat irgendjemand
dieselbe Datei geändert, und plötzlich ist der perfekt funktionierende
Code voller merge conflicts, ehe ich die Chance hatte, ihn durch meinen
Commit sozusagen abzusegnen (und zu sichern!). Das ist Murks.
Mit git gehe ich meist so vor, wenn ich ein kleineres Feature einbaue:
1) Ich ändere irgendwas am Code.
2) Ich starte git gui (siehe Anhang) und markiere nur einige wenige der
gemachten Änderungen für einen neuen Commit. Dabei lasse ich zum
Beispiel eingefügte Debug-Statements weg, und versuche, Kram, der in
einen Commit kommt, thematisch zu gruppieren.
3) Ich gehe wieder zu 1, solange ich mit dem Endergebnis noch nicht
zufrieden bin.
4) Bin ich zufrieden, führe ich oft noch git rebase -i aus und sortiere
Commits um, oder führe mehrere zueinandergehörige zu einem Commit
zusammen.
5) Erst dann muss ich mich darum kümmern, das ganze mit dem Server zu
synchronisieren. Oder auch nicht, wenn ich erst noch weiter testen will,
bevor ich das Ganze mit anderen teile.
Ebenfalls sehr einfach in git und sehr umständlich in svn:
* Schnell mal einen branch erstellen, um etwas auszuprobieren (mit
Versionierung!), ohne dies mit anderen zu teilen
* Commits zwischen mehreren Branches hin- und herschieben (git merge
<branch>, git cherry-pick, ...)
* Gerade erst gemachte Commits nochmal schnell ändern (git commit
--amend, git rebase -i)
* Tags verwalten (git tag)
* Nur einzelne Zeilen oder Chunks für einen Commit verwenden (in git
kann ich einzelne Zeilen auswählen, die nicht in einem Commit landen
sollen!)
* Schnell nachsehen, wer und warum eine Zeile zuletzt geändert hat
(siehe Anhang) (git blame)
* ...
Ich habe jahrelang svn benutzt, und war eigentlich immer ganz zufrieden.
Dann bin ich irgendwann mehr oder weniger gezwungenermaßen zu git
gewechselt, und würde um keinen Preis wieder zurückgehen. ;)
Zu hg kann ich keine qualifizierte Meinung äußern, aber ich hab's
neulich mal ein paar Stunden benutzt, und ehrlich gesagt kam es mir vor
wie git ohne die ganzen coolen Features ;)
Andere Leute, mit denen ich gesprochen habe, haben diese Meinung
bestätigt. Zugegebenermaßen waren das aber auch eher git-Anhänger.
Grüße,
Sven
Danke für die ganzen Antworten, das hilft mir schonmal weiter.
Jörg Wunsch schrieb:> Ggf. solltest du noch Mercurial (hg) in Erwägung ziehen
In meiner Organisation werden derzeit leider nur SVN und Git angeboten
:/
Man kann auch SVN Server haben und auf clientseite (wems gefällt) Git
verwenden:
http://viget.com/extend/effectively-using-git-with-subversion
Man kann also durchaus auch beide Welten vereinen.
Gerade bei kleinen Teams die in der Regel alle in einem Büro/Firma
sitzen würde ich erst mal SVN Empfehlen. Wenn die Leute gar keine Ahnung
haben kann git schon sehr verwirrend und frustrierend sein, auch gibt es
meist für SVN schon eine Integration in viele Tools für Git wird das mit
der zeit auch kommen keine Frage...
Rainbow Dash schrieb:>> Zur Auswahl stehen SVN und GIT.>> Git.>> http://www.youtube.com/watch?v=4XpnKHJAok8
Naja, das ist ungefähr so, wie wenn du für die Frage "Windows oder
Linux" einen Vortrag von Bill Gates als Entscheidungsgrundlage
nehmen würdest.
Wenn nicht einmal der Autor selbst davon überzeugt wäre, dann wär
das ja wohl ein ganz schlechtes Omen.
Läubi .. schrieb:> Gerade bei kleinen Teams die in der Regel alle in einem Büro/Firma> sitzen würde ich erst mal SVN Empfehlen.
Das Problem ist, dass svn einem total die Idee davon kaputt macht, wie
ein VCS eigentlich funktionieren sollte, und wenn man sich erstmal an
svn gewöhnt hat, ist es viel schwerer, in git reinzukommen. Da hat
Torvalds schon recht -- das war auch genau meine Beobachtung, auch ohne
dass ich das Video gesehen hatte.
> Naja, das ist ungefähr so, wie wenn du für die Frage "Windows oder> Linux" einen Vortrag von Bill Gates als Entscheidungsgrundlage> nehmen würdest.
Klar. Trotzdem ist es sicher kein Fehler, sich die Argumente des Autors
mal anzuhören. ;)
Man kann ja ergänzend noch ein ähnliches Video über svn anschauen.
Grüße,
Sven
Sven B. schrieb:> Das Problem ist, dass svn einem total die Idee davon kaputt macht, wie> ein VCS eigentlich funktionieren sollteSVN bietet doch quasi alles was man braucht. Ich denke als VCS taugt es
sehr gut (wir haben es hier mit ~600 Kollegen tagtäglich im Einsatz).
Privat nutze ich auch GIT, und habe keinerlei Schwierigkeiten beim
Umstieg gehabt...
Außer branches, tags, staging area, Commits die nur einige Zeilen
enthalten, getrenntes commit/push, "funktioniert auch wenn der Server
nicht verfügbar ist", schnelles blame/log, ... ;)
Ok -- es gibt anscheinend echt Leute, die das nicht nutzen, obwohl sie
es kennen. Ich kann das nicht ganz nachvollziehen, aber ich gebe zu: svn
ist das einfachere der beiden Systeme. Nur, wie erwähnt, denke ich
dass die Vereinfachungen den Verlust an Funktionalität nicht aufwiegen.
Quibbes schrieb:> Sven B. schrieb:>> Außer branches, tags...>> Äh? SVN hat keine Branches? keine Tags?> Hast du überhaupt schon mal damit gearbeitet?SVN hat keine client-Side Branches. Alle Branches müssen zwingend auf
den Server. Das finde ich persönlich doof, da man dann nicht mal eben
einen kleinen Branch erstellen kann um mal was zu testen.
Rainbow Dash schrieb:> SVN hat keine client-Side Branches. Alle Branches müssen zwingend auf> den Server. Das finde ich persönlich doof, da man dann nicht mal eben> einen kleinen Branch erstellen kann um mal was zu testen.
Da hast du allerdings Recht. Hier ist GIT im Vorteil. Allerdings kann
man auch ohne diese Funktionalität leben, als Killerfeature würde ich es
also nicht bezeichnen. Macht das Leben eben nur ein bisschen einfacher
;-)
Ja, jahrelang. Aber verglichen mit dem, was git unter Branches und Tags
versteht, ist das meiner Meinung nach Murks. ;)
In git ist halt branches echt so einfach:
git branch experimental_feature
git checkout experimental_feature
...
git commit ...
git checkout master
...
Und das ist alles lokal.
Nix mit "svn copy", und so ein branch braucht auch nur wenige Bytes
Speicher. Ich kann nach einem halben Jahr in dem Branch "git rebase
master" machen. Ich kann aus dem Branch weitere Branches abzweigen. etc
Tags macht man in svn ja auch mit copy. In git kann man einfach
git tag v1.4.0 HEAD
machen. Das ist wieder eine Operation, die nur wenige Bytes Speicher
benötigt. Will sagen: git branch / git tag sind zwei Tools, die speziell
für tags und branches gebaut sind und perfekt funktionieren. Bei svn
sind das nur irgendwelche Workarounds. Dass es offizielle Workarounds
sind, macht die Sache nicht besser.
Wofür ich das branch feature zum Beispiel oft nutze, ist um irgendein
Feature zu bauen, von dem ich nicht weiß, ob es funktionieren wird, oder
ob es vielleicht Quatsch ist. Sowas will ich nicht als Kopie der
Repository auf dem Server haben.
Grüße,
Sven
Sven B. schrieb:> Ich kann nach einem halben Jahr in dem Branch "git rebase> master" machen.
Aber eben auch nur, wenn die beiden nicht gerade grundlegend
auseinandergelaufen sind. Solange es keine Konflikte gibt, ist
ein Merge (rebase, wie auch immer) immer recht einfach.
Allerdings ist es richtig, Branches in git oder hg sind sehr viel
leichtgewichtiger als in CVS oder SVN. Andererseits kann man für
lokale Experimente immer noch über eine SVN working copy ein git
oder hg lokal drüberlegen. ;-) Für die genannten Dinge (lokale
Branches, lokale Commits) ist es ja völlig unabhängig, welches VCS
dann auf dem zentralen Master läuft.
Jörg Wunsch schrieb:> Sven B. schrieb:>> Ich kann nach einem halben Jahr in dem Branch "git rebase>> master" machen.>> Aber eben auch nur, wenn die beiden nicht gerade grundlegend> auseinandergelaufen sind. Solange es keine Konflikte gibt, ist> ein Merge (rebase, wie auch immer) immer recht einfach.
Stimmt, aber das ist ein Problem der Sache an sich und nicht Schuld oder
Aufgabe des VCS. Was ich damit sagen wollte, git bietet die
Funktionalität um diesen Prozess so einfach wie möglich zu gestalten,
nämlich "git rebase master", was ungefähr eine Viertelsekunde dauert.
> Andererseits kann man für> lokale Experimente immer noch über eine SVN working copy ein git> oder hg lokal drüberlegen. ;-) Für die genannten Dinge (lokale> Branches, lokale Commits) ist es ja völlig unabhängig, welches VCS> dann auf dem zentralen Master läuft.
Hahaha, das stimmt natürlich, aber ob das so das optimale Modell ist,
bezweifle ich einfach mal. Ich hab' das auch schon gemacht... aber wenn
es sich vermeiden lässt, ist es natürlich besser.
Grüße,
Sven
Sven B. schrieb:> Das Problem ist, dass svn einem total die Idee davon kaputt> macht, wie ein VCS eigentlich funktionieren sollte
Wer bestimmt eigentlich wie "es" funktionieren sollte? Der "Erfinder"
von GIT?
Sven B. schrieb:> Außer ...
Alles schön und gut, aber wenn man es braucht weil man sich irgendwie
erleuchtet fühlt kann man ja git-svn nutzen, aber wie gesagt wenn eh
alle im gleichen Haus/Büro sitzen bringt mir das alles nichts, und der
Verwaltungsoverhead ist auch geringer da eh jeder auf den Zentralen
Server commiten "muss"...
Sven B. schrieb:> Ich kann nach einem halben Jahr in dem Branch> "git rebase master" machen
Wenn nicht zwischenzeitlich die Festplatte/USB Stick o.ä.
verlorengegangen ist wo dein alleiniger lokaler branch liegt.
Gerade in Firmen ist es einfach nicht so, dass jeder "mal so zum testen"
rumwerkelt sondern wenn dann arbeitet man oft gemeinsam auf einem Bugfix
Stand und den will man sowieso zentral haben auf dem Server haben und
nicht irgendwo auf dem USB Stick des Entwicklers der mit diesem gerade
im Zug Richtung Süden für einen zweiwöchigen Urlaub sitzt ;-)
Für stark verteilte (z.B. gemeinschaftliche OS Projekte) ist git eine
gute Sache, für "lokale" Entwicklung bringt es erstmal nur
Verwaltungsoverhead mit sich und der einzelne Entwickler kann ja mit git
arbeiten wenn er den unbedingt sich persönlich entfalten will (siehe
git-svn)...
Sven B. schrieb:> Hahaha, das stimmt natürlich, aber ob das so das optimale Modell ist,> bezweifle ich einfach mal.
Hat durchaus auch Vorteile: man muss sich bei den commit messages
nicht weiter große Mühe geben, da sie eben auch nur lokal sind.
Wenn man dann die komplette Änderung zurück zum Master bringt,
"compiliert" man sich daraus eine politisch korrekte commit message
fürs zentrale VCS.
Wenn sich der ganze experimentelle Branch als großer Murks
herausstellt, macht man einfach ein rm -rf .hg (oder .git), und
gut' ist's.
Hi,
Läubi .. schrieb:> Sven B. schrieb:>> Das Problem ist, dass svn einem total die Idee davon kaputt>> macht, wie ein VCS eigentlich funktionieren sollte> Wer bestimmt eigentlich wie "es" funktionieren sollte? Der "Erfinder"> von GIT?
Ich bestimme das, weil ich muss es ja schließlich auch benutzen. Du
kannst natürlich eine andere Meinung davon haben, wie ein VCS
funktionieren sollte.
> Sven B. schrieb:>> Außer ...> Alles schön und gut, aber wenn man es braucht weil man sich irgendwie> erleuchtet fühlt kann man ja git-svn nutzen, aber wie gesagt wenn eh> alle im gleichen Haus/Büro sitzen bringt mir das alles nichts, und der> Verwaltungsoverhead ist auch geringer da eh jeder auf den Zentralen> Server commiten "muss"...
Mache ich auch, wenn ich mal mit einem svn-Projekt konfrontiert werde.
Viele gibt es zum Glück nicht mehr. ;)
> Sven B. schrieb:>> Ich kann nach einem halben Jahr in dem Branch>> "git rebase master" machen> Wenn nicht zwischenzeitlich die Festplatte/USB Stick o.ä.> verlorengegangen ist wo dein alleiniger lokaler branch liegt.
Ich kann den Branch auch problemlos irgendwohin pushen -- andere Leute
merken nichts davon, wenn sie nicht explizit diesen Branch anfordern.
> Gerade in Firmen ist es einfach nicht so, dass jeder "mal so zum testen"> rumwerkelt sondern wenn dann arbeitet man oft gemeinsam auf einem Bugfix> Stand und den will man sowieso zentral haben auf dem Server haben und> nicht irgendwo auf dem USB Stick des Entwicklers der mit diesem gerade> im Zug Richtung Süden für einen zweiwöchigen Urlaub sitzt ;-)
Wenn man Code schreibt, ist das -- zumindest bei mir -- immer "mal so
zum testen". In den meisten Situationen finde ich es schwer, vorher zu
beurteilen ob das Endergebnis sowohl vom Code als auch von der
Funktionalität her akzeptabel sein wird, und finde es deshalb von
Vorteil, den Kram in einem eigenen Branch (ob lokal oder mit irgendeinem
Server synchronisiert) ausprobieren zu können, ohne andere dabei zu
stören. Bei Bugfixes ist das natürlich alles etwas einfacher, aber
Entwicklung an einer Anwendung besteht ja nicht nur aus Bugfixes.
> Für stark verteilte (z.B. gemeinschaftliche OS Projekte) ist git eine> gute Sache, für "lokale" Entwicklung bringt es erstmal nur> Verwaltungsoverhead mit sich und der einzelne Entwickler kann ja mit git> arbeiten wenn er den unbedingt sich persönlich entfalten will (siehe> git-svn)...
Hm, das verstehe ich nicht ganz? Also meine Projekte fangen immer damit
an, dass ich einen leeren Ordner anlege und dort "git init" ausführe. In
den meisten Fällen kommt dann eh nur Murks raus, und ich vergesse das
Ganze. Wenn's doch was wird, pushe ich die Repository irgendwann auf
github oder so. Das muss ich mir aber nicht überlegen, bevor ich das
Projekt beginne -- ich kann alles lokal machen, und dann irgenwann die
komplette History pushen. Das geht mit svn sicher auch irgendwie, aber
bei git ist es so entworfen, dass das so funktioniert, und es ist auch
dementsprechend einfach (nämlich quasi kein Aufwand, zwei Kommandos oder
so).
Grüße,
Sven
Sven B. schrieb:> Ich bestimme das, weil ich muss es ja schließlich auch benutzen.
Naja, aber eben deshalb finde ich (private Meinung) das gerangel um ein
"besseres" oder "richtigeres" VCS quatsch.
Sven B. schrieb:> In den meisten Fällen kommt dann eh nur Murks raus, und> ich vergesse das Ganze. Wenn's doch was wird, pushe ich> die Repository irgendwann auf github oder so
Das ist aber halt meist nicht der Prozess welchen man in einem
(Firmen-)Team hat. Und so hört es sich beim TE aber an, deswegen sage
ich ja für verteilte (OS) Projekte ist git sicher das Mittel der Wahl,
es als Allheillösung oder "besseres SVN/CSV/..." anzupreisen meiner
Meinung nach aber nicht zielführend.
Hi,
Manchmal unterscheiden sich Meinungen, weil es tatsächlich
unterschiedliche Meinungen sind. Oft aber unterscheiden sie sich auch,
weil die Person A mit Meinung A einfach ein paar wichtige Sachen nicht
verstanden hat, die Person B mit Meinung B weiß. Und wenn Person B der
Person A diese Sachen erklärt, würde A seine Meinung vielleicht ändern.
Aus diesem Grund finde ich es nicht unsinnig, über solch ein Thema zu
diskutieren, auch wenn es im Endeffekt Geschmackssache ist, welches
VCS man bevorzugt. (Ich möchte damit nicht sagen, dass ich mich mit
Person B identifiziere)
> Das ist aber halt meist nicht der Prozess welchen man in einem> (Firmen-)Team hat.
Zum einen kann man git genau so nutzen wie svn: wenn man git commit und
git push immer zusammen verwendet und branches immer pusht, gibt's da
nur wenig Unterschiede. Bis darauf, dass git schneller ist.
Zum anderen ... siehe Anfang meines Beitrags. Vielleicht läuft das nur
so ab, weil es sowieso keine andere Möglichkeit gibt, und vielleicht
würde es besser funktionieren, wenn es anders wäre. Vielleicht.
Grüße,
Sven
Jörg Wunsch schrieb:> Andererseits kann man für> lokale Experimente immer noch über eine SVN working copy ein git> oder hg lokal drüberlegen. ;-) Für die genannten Dinge (lokale> Branches, lokale Commits) ist es ja völlig unabhängig, welches VCS> dann auf dem zentralen Master läuft.
Wenn die Entwickler in Git so gut eingearbeitet sind, dass sie es
gewinnbringen lokal benutzen können, spricht eigentlich wenig dagegen,
es auch serverseitig zu verwenden. Ja, ich habe deinen Smiley schon
gesehen und liefere deswegen ebenfalls einen ;-)
Bei bobberjahn ist jedoch die Situation die, dass er SVN bereits kann,
Git aber noch nicht. Deswegen habe ich ihm weiter oben vorgeschlagen,
erst einmal bei SVN zu bleiben (auch wenn ich persönlich lieber Git
benutze). Er verzichtet damit zwar auf die tollen Git-Features, aber das
heißt ja nicht, dass man mit SVN nicht ebenfalls produktiv arbeiten kann
(bei Git würde auf Grund der Einarbeitung erst einmal eine unproduktive
Phase entstehen).
Yalu X. schrieb:> Wenn die Entwickler in Git so gut eingearbeitet sind, dass sie es> gewinnbringen lokal benutzen können, spricht eigentlich wenig dagegen,> es auch serverseitig zu verwenden.
Ich schrieb ja "git oder hg". In meinem Falle komme ich mit git rein
gar nicht zurecht (weil "alles ganz anders ist"), mit hg dagegen sehr
wohl. (hg wiederum steht dem TE nicht zur Verfügung.) Außerdem hat
diese Vorgehensweise den Vorteil, dass gewissermaßen SVN der kleinste
gemeinsame Nenner zwischen allen beteiligten Entwicklern ist, aber
diejenigen, die die erweiterten Möglichkeiten eines DVCS nutzen
wollen, das per Overlay trotzdem tun können (ohne dass die anderen
überhaupt was davon merken).
Ein riesiger Vorteil von SVN gegenüber GIT sind die Locks. Unter GIT
gibt es keine Möglichkeit, Konflikte zwischen verschiedenen Anwendern
beim Bearbeiten von Binärdateien zu vermeiden (zumindest sind mir keine
bekannt).
Aus diesem Grund führt bei uns in der Firma nach wie vor kein Weg an SVN
vorbei.
Sven B. schrieb:> Verstehe ich nicht. Kannst du die Situation mal genauer erklären?
Ich kann's versuchen ;-)
Stell dir vor im repo ist ein Word Dokument abgelegt.
GIT:
Alice ändert lokal bei sich was an diesem Dokumnet. Bob ändert ebenfalls
was an diesem Dokument bei sich auf dem Rechner. Nun comitted und pusht
Alice ihr Dokument ins Zenral-repo.
Bob steht jetzt dumm da, weil er Binärdateien nicht mergen kann. Nun
muss er entweder die Datei von Alice nehmen, und seine Änderungen
nochmal machen, oder Alices Datei überschreiben und sie auffordern ihre
Änderungen nochmal zu machen.
SVN:
Alice will das Word Dokument bearbeiten. dazu muss sie sich das Lock
holen, und kann loslegen. Nun möchte auch Bob das Dokument verändern.
Hier verhindert SVN, dass Bob auch ein Lock bekommt. Er bekommt die
Nachricht, dass Alice gerade das Dokument bearbeitet, und dass er warten
muss. Erst wenn Alice fertig ist darf Bob auf dem aktualisierten
Word-Dokument weiterarbeiten.
=> Es kann nichts passieren, keine Arbeit wird unnötig gemacht und muss
später verworfen werden
Ich hoffe das war einigermaßen verständlich?
Ja, ok.
Sowas geht mit git tatsächlich nicht, weil es halt als
Versionierungssystem gedacht ist für Dateien die sich auch tatsächlich
versionieren lassen -- was bei Word-Dokumenten ohne weiteres nicht der
Fall ist ;)
Grüße,
Sven
mindestens ebenso entscheidend wie der funktionsumfang eines vcs ist die
akzeptanz der mitarbeiter die angebotenen funktionen auch zu nutzen.
wir haben es unseren starentwicklern in 10 jahren nicht beibringen
können produktions- und testingflags zu setzen oder files zu branchen.
Wie sieht es bei GIT aus zwecks looks ?
Wenn die aktuelle SW ein review gemacht wird, ein Build eingefroren
werden
muss, weil es releast wurde und die sourcen so bleiben müssen wie es
releast
wurde, usw , wie geht das bei GIT ? Bei SVN lookt man den
Build/branch/...
und gut is.
Auch z.B. Keys, ein Beispiel für Bootloader verschlüsselung, usw,
sollten nicht änderbar sein. Wie wird das in GIT gemacht ?
Ich sehe nicht wirklich, warum man das machen muss? Man macht z.B. einen
Branch für ein stable release und sagt den Leuten "keine Feature-Commits
in diese Branch". Wenn man ein Release macht, macht man einen Tag dafür,
dann kann man den Stand bei diesem Tag jederzeit nachsehen.
Das mit dem Schlüssel verstehe ich noch weniger. Wenn der nicht geändert
werden soll, dann ändert ihn halt niemand. Wo ist das Problem?
Wenn du sowas technisch erzwingen willst, kannst du einen Commit-Hook
bauen.
Grüße,
Sven
P.S.: Das Wort heißt "lock" ;)
Sven B. schrieb:> sagt den Leuten "keine Feature-Commits> in diese Branch"Sven B. schrieb:> Wenn der nicht geändert> werden soll, dann ändert ihn halt niemand
Sinn und Zweck eines VCS ist es ja, die Entwickler im Zaum zu halten.
Mündliche Absprachen sollten da eigentlich nicht notwendig sein ;-)
Insofern ist es schon gut, wenn das VCS alles Unerwünschte
unterbindet...
Das mit den Hooks sagt mir jetzt nicht, viel, geht aber vermutlich in
diese Richtung?
Klabauter schrieb:> Sinn und Zweck eines VCS ist es ja, die Entwickler im Zaum zu halten.
Da bin ich anderer Meinung. Sinn eines VCS ist, ein möglichst flexibles
Werkzeug zur Versionierung für den Entwickler zu sein.
> Mündliche Absprachen sollten da eigentlich nicht notwendig sein ;-)
Naja, du kannst doch kein Release einer Anwendung machen, indem du
deinem VCS sagst "ab jetzt darf keiner mehr in diesen Branch
schreiben"... wie soll das denn funktionieren. Natürlich müssen sich die
Entwickler mündlich absprechen, dass sie dann und dann ein Release mit
den und den Features machen wollen.
> Insofern ist es schon gut, wenn das VCS alles Unerwünschte> unterbindet...
Unerwünscht, wie zum Beispiel...?
Die Entwickler müssen schon selbst entscheiden, wann sie in einen Branch
schreiben wollen oder nicht. Wer soll das sonst entscheiden -- der
Server-Admin? Wieso sollte der das besser wissen als die Entwickler?
Wer nicht will, dass jemand anders dazwischen funkt, kann sich ja selbst
eine Kopie vom Repo anlegen und nicht pullen -- das ist ja das tolle an
"verteilt" ;)
> Das mit den Hooks sagt mir jetzt nicht, viel, geht aber vermutlich in> diese Richtung?
Du kannst ein Skript schreiben, was irgendwelche Checks macht, bevor ein
Commit vom Server akzeptiert wird, und wenn das Skript nicht zufrieden
ist, lehnt es den Commit ab. Die KDE-Server akzeptieren zum Beispiel
keine Commits, die Objektcode enthalten.
Auf die Art ist es natürlich auch möglich, ganze Branches oder Repos zu
sperren -- oder Dateien.
Grüße,
Sven
Sven B. schrieb:> Unerwünscht, wie zum Beispiel...?
Bei uns Z.B. wenn ein großer Merge eines Branches in den Haupt-Branch
durchgeführt werden soll. Das kann durchaus mehrere Tage dauern, während
derer der Branch für die Entwickler gesperrt wird um zusätzliche
Komplikationen zu vermeiden.
Sven B. schrieb:> Die Entwickler müssen schon selbst entscheiden, wann sie in einen Branch> schreiben wollen oder nicht. Wer soll das sonst entscheiden
Wir haben dafür ein Team von Leuten, die sich um das Branching und die
Merges kümmern. Der einzelne Entwickler hat da nichts dran zu tun...
Ich merk schon, die Prozesse laufen bei euch deutlich anders als bei uns
;-)
chris schrieb:> Wie sieht es bei GIT aus zwecks looks ?> Wenn die aktuelle SW ein review gemacht wird, ein Build eingefroren> werden> muss, weil es releast wurde und die sourcen so bleiben müssen wie es> releast> wurde, usw , wie geht das bei GIT ? Bei SVN lookt man den> Build/branch/...> und gut is.> Auch z.B. Keys, ein Beispiel für Bootloader verschlüsselung, usw,> sollten nicht änderbar sein. Wie wird das in GIT gemacht ?
Mit Tags.
Tags können im Nachhinein nicht verändert werden.
Zusatz Empfehlung: einen Branch für jedes release, sodass bugfixes genau
auf dem Branch eingepflegt werden können (und dann ohne probleme auf den
master/Head/trunk branch gezogen werden können)
bobberjahn schrieb:> Eingesetzt werden soll das repo zum Speichern von uC Code, der mit MPlab> generiert wurde. MPLab bietet out of the box SVN support, aber kein Git> wie ich gesehen habe. Ausserdem sollen dort Eagle Layouts und Visual> Studio Code gespeichert werden. Gerade bei Eagle waeren Erfahrungen mit> Versionskontrollen hilfreich, da habe ich keine.
Damit Du Eagle vernünftig mit einer Versionsverwaltung einsetzen kannst,
ist ein Update auf die Version 6 notwendig. Ab dieser Version werden
alle Dateien (sch/brd/lbr) als XML abgespeichert und nicht mehr als
Binärblobs. Das heißt dann auch: Erst ab dieser Version kann eine
Versionsverwaltung ein richtiges diff machen und bei Änderungen nur die
Deltas abspeichern anstelle des gesamten Blobs.
Beim Update musst Du darauf achten, dass Du ALLE sch/brd/lbr einmal mit
Eagle 6 lädst und neu speicherst, um alles als XML vorliegen zu haben.
fchk
Ich arbeite nicht als Software-Entwickler, ich kenne das nur aus der
Open-Source-Welt ;)
Aber ja, sowas läuft bei git tatsächlich deutlich anders. Das Video von
Torvalds von weiter oben aus dem Thread behandelt genau diese
Unterschiede relativ ausführlich. Er beschwert sich auch sehr laut
darüber, dass es bei CVS & Co immer extra Leute gibt, die sich um das
Branching kümmern müssen ;)
In git würde halt irgendjemand den Merge von einem Branch vornehmen, und
zwar lokal -- der Branch müsste dafür dann nicht gesperrt werden, denn
wenn sich etwas ändert, kann man einfach, nachdem der erste Merge
abgeschlossen ist, noch einen Merge machen. Der wird dann ja in der
Regel sehr einfach sein. Git kümmert sich darum, dass nicht dieselben
Änderungen zweimal gemerged werden.
Grüße,
Sven
Frank K. schrieb:> Beim Update musst Du darauf achten, dass Du ALLE sch/brd/lbr einmal mit> Eagle 6 lädst und neu speicherst, um alles als XML vorliegen zu haben.
Wobei natürlich ein Merge von XML-Daten trotzdem noch heikel ist.
Je nach Änderungen kann die Benutzbarkeit des Ergebnisses durchaus
sehr unterschiedlich ausfallen. ;-) Aber natürlich allemal besser
als reine Binärblobs.
Jörg Wunsch schrieb:> Frank K. schrieb:>> Beim Update musst Du darauf achten, dass Du ALLE sch/brd/lbr einmal mit>> Eagle 6 lädst und neu speicherst, um alles als XML vorliegen zu haben.>> Wobei natürlich ein Merge von XML-Daten trotzdem noch heikel ist.> Je nach Änderungen kann die Benutzbarkeit des Ergebnisses durchaus> sehr unterschiedlich ausfallen. ;-) Aber natürlich allemal besser> als reine Binärblobs.
DANKE für diese Info. Ich hab das jetzt mehrmals hier im Forum gelesen,
dass das so toll sei, dass EAGLE jetzt in einem menschenlesbaren Format
abspeichert und man viel besser die SVN Features nutzen kann. Und jedes
mal habe ich mich beispielsweise gefragt, was passiert, wenn der eine
ein Bauteil hinzufügt und jemand zweites ein anderes Bauteil einfügt,
die im Board beispielsweise an die gleiche Position platziert werden.
Das gibt doch das totale Durcheinander.
Das Problem ist, dass die Merge-Funktionalität zeilenweise arbeitet.
Für XML müsste sie aber auf der Ebene von XML-Elementen arbeiten,
völlig unabhängig davon, ob nun alle XML-Elemente auf einer Zeile
stehen oder "klassisch" eingerückt sind.
Konflikte wie deiner würden natürlich trotzdem nicht erkannt, da
das sich ergebende XML zwar valide ist, aber sinnlos.
Ich glaube auch nicht, dass es sinnvoll ist, Schaltpläne im XML-Format
auf Textebene zu mergen:
- Dinge, die im Schaltplan logisch eng miteinander verknüpft sind,
stehen in der XML-Datei nicht unbedingt eng beieinander, so dass
Konflikte nur schwer erkennbar sind.
- Bei einem gewöhnlichen Quellcode-Merger kann es passieren, dass das
Merge-Ergebnis so verhunzt ist, dass es von Eagle nicht mehr gelesen
wird. Man müsste dann die Korrekturen manuell auf XML-Ebene durchfüh-
ren.
- Auch ein manuelles Mergen auf XML-Ebene ist praktisch unmöglich, da
die logischen Zusammenhänge der Schaltung aus dem XML-Text praktisch
überhaupt nicht ersichtlich sind.
Ein spezielles Eagle-Merge-Tool würde diese Probleme prinzipiell lösen,
aber selbst dann ist es für einen Entwickler sehr aufwendig, das Merge-
Ergebnis auf elektrische Korrektheit zu prüfen. Da er nicht weiß, wo
genau die Änderungen gemacht wurden, müsste er nach jdem Merge jedes
Detail der Schaltung aufs Neue überprüfen.
Bei Platinenlayouts wird die Sache noch schwieriger, da dort eine kleine
Änderung (wie bspw. das Verschieben eines Bauteils um 1 mm oder die
Verbreiterung einer Leiterbahn) einen ganzen Rattenschwanz an weiteren
Änderungen (bspw. das Verschieben vieler Leiterbahnen, Vias u.ä. in der
Umgebung) nach sich zieht. Gleichzeitige Änderungen von mehreren
Entwicklern werden deswegen fast immer zum Konflikt führen.
Wesentlich sinnvoller als ein automatischer Merger wäre ein interaktives
Tool, das die Unterschiede zwischen zwei Schaltplänen in einem
grafischen Editor farblich hervorhebt und dem Benutzer die Möglichkeit
bietet, jeden dieser Unterschiede in die neue Version zu übernehmen oder
zu verwerfen. So ein Tool müsste aber wohl erst noch geschrieben werden.
Solange es dieses Tool nicht gibt, ist es am besten, den Schaltplan
(bzw. bei modular aufgebauten Schaltplänen jedes Modul) und das Layout
immer nur ein einem Entwickler gleichzeitig bearbeiten zu lassen. Es ist
die Aufgabe des Projektleiters, jeweils einen geeigneten Entwickler zu
bestimmen, der für eine bestimmte Änderung zuständig ist. Dann muss die
Datei auch nicht gelockt werden.
Oder sowas wie gobby oder Google Docs, was Bearbeiten eines Dokumens von
mehreren Leuten gleichzeitig erlaubt und die Änderungen der anderen
Personen sofort darstellt.