{"id":651,"date":"2011-09-01T20:21:41","date_gmt":"2011-09-01T18:21:41","guid":{"rendered":"http:\/\/blog.speedyj.de\/?p=651"},"modified":"2019-03-11T17:03:41","modified_gmt":"2019-03-11T15:03:41","slug":"svn-und-git-nutzen","status":"publish","type":"post","link":"https:\/\/blog.speedyj.de\/?p=651","title":{"rendered":"SVN und GIT nutzen"},"content":{"rendered":"<p>Als Entwickler geh\u00f6rt das Verwenden einer <a href=\"http:\/\/de.wikipedia.org\/wiki\/Versionsverwaltung\" target=\"_blank\">Versionsverwaltung<\/a> zur t\u00e4glichen Arbeit. In meinem Umfeld kommt dabei h\u00e4ufig (&#8222;noch&#8220;) <a href=\"http:\/\/de.wikipedia.org\/wiki\/Subversion_%28Software%29\" target=\"_blank\">Subversion<\/a> (kurz &#8222;SVN&#8220;) zum Einsatz. Dabei handelt es sich um ein sogenanntes Zentrales Versionsverwaltungssystem, wo das <a href=\"http:\/\/de.wikipedia.org\/wiki\/Repository\" target=\"_blank\">Repository<\/a> durch einen zentralen Server verwaltet wird. Viele Aktionen (wie z.B. die History-Funktion und Commit) ben\u00f6tigen somit Zugriff auf diesen Server.<\/p>\n<p>Anders verh\u00e4lt es sich da bei den sogenannten &#8222;Verteilten Versionsverwaltungssystemen&#8220;. Hier wird auf dem eigenen Rechner eine Kopie des Repositories abgelegt (oder von einem Teil des Repositories). In dieser lokalen Kopie kann man jederzeit Branches erstellen, Commits durchf\u00fchren oder die Historie einsehen. Also egal wo man sich gerade aufh\u00e4lt, ob unterwegs, ob mit oder ohne Netzzugang, man kann an seiner eigenen Entwicklung weiterarbeiten. Zus\u00e4tzlich schlie\u00dfen diese verteilten Versionsverwaltungssysteme den Einsatz einer zentralen Repository-Kopie nicht aus. Man kann weiterhin ein zentralen Repository mit Zugang f\u00fcr jeden Entwickler bereitstellen.<\/p>\n<p>Da in letzter Zeit eins meiner zentralen SVNs hin und wieder nicht \u00fcbers Netz erreichbar war, habe ich nach einer Alternative gesucht, wie sich die Vorteile von einer verteilten Versionsverwaltung mit einer zentralen SVN-Verwaltung kombinieren lassen. Und kurzem Suchen im Netz bin ich auf <a href=\"http:\/\/www.kernel.org\/pub\/software\/scm\/git\/docs\/git-svn.html\" target=\"_blank\">git-svn<\/a> gesto\u00dfen. Dieses Tool erm\u00f6glich das Erstellen eines Git-Repositories auf Basis eines SVN-Repositories. An dem so erstellten Repo k\u00f6nnen \u00c4nderung vorgenommen werden und sp\u00e4ter wieder an das zentrale SVN \u00fcbertragen werden. Klasse, genau was ich brauchte. Zus\u00e4tzlich gibt es f\u00fcr Windows noch die TortoiseGit-Explorer-Erweiterung, die auch git-svn unterst\u00fctzt. Aber dazu sp\u00e4ter noch mehr.<\/p>\n<p><strong>Lesematerial<\/strong><\/p>\n<p>Wer aus der &#8222;SVN-Welt&#8220; kommt und auf ein verteiltes System wie Git wechselt, muss erstmal verstehen, wie ein solches System funktioniert. Auch gibt es neue Begrifflichkeiten, die man zumindest ansatzweise verstanden haben sollte. Eine relativ guten Einstieg habe ich im Online-Buch &#8222;<a href=\"http:\/\/git-scm.com\/book\/\" target=\"_blank\">Pro Git<\/a>&#8220; gefunden. Eine Gegen\u00fcberstellung zwischen SVN- und Git-Befehlen kann man <a href=\"http:\/\/git.or.cz\/course\/svn.html\" target=\"_blank\">hier nachlesen<\/a>.<\/p>\n<p><strong>Installation<\/strong><\/p>\n<p>Nun ging es an einen ersten Test. Daf\u00fcr habe ich die Git-Version 1.7.4 von <a href=\"http:\/\/git-scm.com\" target=\"_blank\">http:\/\/git-scm.com<\/a> heruntergeladen und installiert. Die Installation von Git ist weitestgehend selbsterkl\u00e4rend. Nur die Einstellung &#8222;Line Ending Conversion&#8220; ist nicht ganz selbsterkl\u00e4rend. Wenn man vorhat, mittels Git auf ein SVN-Repository zuzugreifen, dann sollte man hier &#8222;Checkout as-is, commit as-is&#8220; w\u00e4hlen.<\/p>\n<p><a href=\"http:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/git-autocrlf-setting1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-662\" title=\"git-autocrlf-setting\" src=\"http:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/git-autocrlf-setting1-300x232.png\" alt=\"\" width=\"300\" height=\"232\" srcset=\"https:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/git-autocrlf-setting1-300x232.png 300w, https:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/git-autocrlf-setting1.png 513w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><strong>Testen<\/strong><\/p>\n<p>Nach der Installation findet man im Windows-Startmen\u00fc die &#8222;Git Bash&#8220;, also die Kommandozeile f\u00fcr Git. Dabei handelt es sich um eine Unix-like Shell f\u00fcr Windows. Die Navigation im Dateisystem l\u00e4uft hier etwas anders als normalerweise unter Windows. So wechselt man mit &#8222;cd \/d&#8220; auf das Laufwerk D:\\, und mittels &#8222;ls&#8220; kann man sich den Inhalt des aktuellen Verzeichnisses auflisten.<\/p>\n<p><a href=\"http:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/git-bash.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-655\" title=\"git-bash\" src=\"http:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/git-bash-300x173.png\" alt=\"\" width=\"300\" height=\"173\" srcset=\"https:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/git-bash-300x173.png 300w, https:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/git-bash.png 677w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Mit folgender Zeile kann man mittels &#8222;git svn&#8220; eine Kopie eines SVN-Repositories erstellen:<\/p>\n<pre style=\"padding-left: 30px;\"><span style=\"color: #888888;\">$ git svn clone http:\/\/localhost\/svn\/arxml -s<\/span>\n<span style=\"color: #888888;\">Initialized empty Git repository in d:\/git_test\/arxml\/.git\/<\/span>\n<span style=\"color: #888888;\">r1 = 79ac10e9eacb0d38a1466fd2c834903afe81c2f8 (refs\/remotes\/trunk)<\/span>\n<span style=\"color: #888888;\"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; api.h<\/span>\n<span style=\"color: #888888;\"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stdafx.h<\/span>\n<span style=\"color: #888888;\">...<\/span>\n<span style=\"color: #888888;\">r18 = d28954ccd89dad6eedf1331a1f8609c01cf1ce7b (refs\/remotes\/trunk)<\/span>\n<span style=\"color: #888888;\">Checked out HEAD:<\/span>\n<span style=\"color: #888888;\">&nbsp; http:\/\/localhost\/svn\/arxml\/trunk r18 <\/span><\/pre>\n<p>Die Option &#8222;-s&#8220; am Ende des Befehls gibt an, dass es sich um eine Standard-SVN-Sturktur mit Unterverzeichnissen &#8222;branches&#8220;, &#8222;tags&#8220; und &#8222;trunk&#8220; handelt. Wenn man das nicht getan hat, sollte man die Option weglassen oder falls man andere Name gew\u00e4hlt hat kann man das \u00fcber folgenden Befehl anpassen (wobei hier auch wieder die Standard-Namen eingesetzt wurden):<\/p>\n<pre style=\"padding-left: 30px;\"><span style=\"color: #888888;\">$ git svn clone http:\/\/localhost\/svn\/arxml -T trunk -b branches -t tags<\/span><\/pre>\n<p>Also gut. Mit dem Befehl haben wir ein Git-Repository erstellt und dieses mit dem Inhalt eines SVN-Repository gef\u00fcllt. Mittels cd wechseln wir nun in den neu erstellten Ordner. Nach dem &#8222;git svn clone&#8220; Befehl, wird normalerweise der master-Branch gew\u00e4hlt, welcher dem &#8222;trunk&#8220; entspricht (oder falls man die Option -s weggelassen hat, die oberste Ebene).<\/p>\n<p>Wenn man also die Historie einsehen m\u00f6chte:<\/p>\n<pre style=\"padding-left: 30px;\"><span style=\"color: #888888;\">$ git log<\/span><\/pre>\n<p>Hat man \u00c4nderungen an Dateien vorgenommen, kann man diese auch in das Repository \u00fcbertragen.<\/p>\n<pre style=\"padding-left: 30px;\"><span style=\"color: #888888;\">$ git commit -am \"added new usage instructions\"<\/span><\/pre>\n<p>Da wir aber nun mit zwei Repositories arbeiten (lokal:Git und remote:SVN), hat der &#8222;git commit&#8220; Befehl lediglich die \u00c4nderung in das lokale Git-Repository geschrieben. Um auch das SVN-Repo zu aktualisieren, nutzt man &#8222;git svn dcommit&#8220;:<\/p>\n<pre style=\"padding-left: 30px;\"><span style=\"color: #888888;\">$ git svn dcommit<\/span>\n<span style=\"color: #888888;\">Committing to http:\/\/localhost\/svn\/arxml ...<\/span>\n<span style=\"color: #888888;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Main.cpp<\/span>\n<span style=\"color: #888888;\">Committed r19 <\/span>\n<span style=\"color: #888888;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Main.cpp<\/span>\n<span style=\"color: #888888;\">r19 =&nbsp;854e82f4860d474a9a5db7bca6746d101448e100 (trunk)<\/span>\n<span style=\"color: #888888;\">No changes between current HEAD and refs\/remotes\/trunk<\/span>\n<span style=\"color: #888888;\">Resetting to the latest refs\/remotes\/trunk<\/span><\/pre>\n<p>Unsere \u00c4nderung sind jetzt im SVN und die Revisionsnummer (r19) wurde im Git-Repository vermerkt. Jetzt kann es nat\u00fcrlich vorkommen, dass in der Zwischenzeit ein anderer Entwickler \u00c4nderungen in das SVN-Repo \u00fcbertragen hat. In diesem Fall m\u00fcssen die \u00c4nderungen vor dem &#8222;dcommit&#8220; in das Git-Repository geholt werden und das geht mit dem rebase-Befehl.<\/p>\n<pre style=\"padding-left: 30px;\"><span style=\"color: #888888;\">$ git svn rebase<\/span>\n<span style=\"color: #888888;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notes.txt<\/span>\n<span style=\"color: #888888;\">r20 = c373de5f458c76f3b0e2e5027cd92eebeaa0e55d (trunk)<\/span>\n<span style=\"color: #888888;\">First, rewinding head to replay your work on top of it...<\/span>\n<span style=\"color: #888888;\">Fast-forwarded master to refs\/remotes\/trunk.<\/span><\/pre>\n<p>Nun, das soll f\u00fcr&#8217;s erste reichen. Mehr Informationen zu den Befehlen findet man im <a href=\"http:\/\/www.kernel.org\/pub\/software\/scm\/git\/docs\/git-svn.html\" target=\"_blank\">git-svn-Manual<\/a>.<\/p>\n<p><strong>Problem mit Zeilenenden<\/strong><\/p>\n<p>Etwas Schwierigkeiten hat mir sp\u00e4ter das automatische Konvertieren von Zeilenumbr\u00fcchen durch Git bereitet. Hier hat mir <a href=\"http:\/\/code.google.com\/p\/msysgit\/issues\/detail?id=21\" target=\"_blank\">msysGit Issue 21<\/a> etwas weitergeholfen, wenn auch keine definitive Empfehlung gegeben. SVN k\u00fcmmert sich normalerweise nicht um die Inhalte von Dateien (siehe <a href=\"http:\/\/svnbook.red-bean.com\/en\/1.5\/svn-book.html#svn.advanced.props.special.eol-style\" target=\"_blank\">svnredbook<\/a>). D.h. wenn eine Datei unter Windows ins SVN \u00fcbertragen wird, enth\u00e4lt die Datei im Normalfall CRLF Umbr\u00fcche. Installiert man jedoch Git mit den Standardeinstellungen (core.autocrlf = true), dann wird jede Textdatei im Repository ins Unix-Style-LineEnding-Format (also LF) konvertiert. Bei der ausschlie\u00dflichen Nutzung von Git ist das sicherlich die beste Wahl. Wenn man jedoch mittels Git auf SVN zugreift, f\u00fchrt das automatische Umwandel zu Problemen (zumindest war es bei mir der Fall). Hat man wie weiter oben geschrieben ein SVN-Repo mittels &#8222;git svn&#8220; geklont und \u00fcbertr\u00e4gt \u00c4nderungen (bei core.autocrlf=true) in das Git-Repository, dann enth\u00e4lt die Datei im Git-Repo lediglich LF-Umbr\u00fcche. \u00dcbertr\u00e4gt man diese Datei ins SVN, kann es dazu f\u00fchren, dass jede Zeile als ge\u00e4ndert markiert wird. Es ist also wichtig zu wissen, welche Zeilenumbr\u00fcche in den Dateien des SVN-Repo&#8217;s normalerweise verwendet werden.<\/p>\n<p>Viele Texteditor k\u00f6nnen mittlerweile mit den verschiedenen Zeilenumbr\u00fcchen umgehen. Deswegen k\u00f6nnte man schnell annehmen, dass es doch egal ist in, welche Umbr\u00fcche in der Datei verwendet werden. Fakt ist jedoch, das viele andere Tools (wie z.B. Compiler, Parser) h\u00e4ufig erwarten, dass in den Eingabedateien Zeilenumbr\u00fcche des jeweiligen Betriebssystems verwendet werden. Aus diesem Grund ist auch die autocrlf-Variable durchaus sinnvoll. Jedoch kann aus dem gleichen Grund keine allgemeine Festlegung f\u00fcr die Standardeinstellung von core.autocrlf gegeben werden. Je nach Projekt, eingesetzten Betriebssystemen und SVN-Konfiguration kann eine andere Wahl sinnvoll sein. F\u00fcr meine spezifischen Fall (SVN-Clients = Windows), muss autocrlf auf &#8222;false&#8220; gesetzt werden.<\/p>\n<p><strong>Jetzt nochmal, nur einfacher<\/strong><\/p>\n<p>Das ganze Arbeiten in der &#8222;Git-Bash&#8220; ist ja sch\u00f6n und gut. Hilft auf jeden Fall dabei, die Arbeitsweise von Git besser zu verstehen. Aber wer <a href=\"http:\/\/tortoisesvn.tigris.org\/\" target=\"_blank\">TotoiseSVN<\/a> kennen und lieben gelernt hat, wird nur ungern darauf verzichten wollen. Zum Gl\u00fcck haben das ein paar Entwickler fr\u00fchzeitig erkannt. <a href=\"http:\/\/code.google.com\/p\/tortoisegit\/\" target=\"_blank\">TortoiseGit<\/a> f\u00fcr Klicki-Bunties.<\/p>\n<p><span style=\"text-decoration: underline;\">Installationsreihenfolge<\/span><\/p>\n<ul>\n<li><a href=\"http:\/\/git-scm.com\/\" target=\"_blank\">Git<\/a> f\u00fcr Windows installieren<br \/>\n(hier sollte man w\u00e4hrend der Installation die Explorer-Context-Men\u00fc Erweiterungen deaktivieren)<\/li>\n<li><a href=\"http:\/\/code.google.com\/p\/tortoisegit\/\" target=\"_blank\">TortoiseGit<\/a> installieren<\/li>\n<\/ul>\n<p><strong>Testen, die zweite<\/strong><\/p>\n<p>Nach der Installation wollen wir nochmal das SVN-Repo klonen. Nur um die M\u00f6glichkeit mittels TortoiseGit zu testen. Notwendig ist es eigentlich nicht. Man kann mit dem \u00fcber Git-Bash erstellten Repo auch einfach weiterarbeiten. Ich habe daher zun\u00e4chst das Verzeichnis &#8222;D:\\git_test&#8220; wieder geleert. Im leeren Ordner \u00f6ffnet man das Kontext-Men\u00fc und w\u00e4hlt dort &#8222;Git Clone&#8220;.<\/p>\n<p><a href=\"http:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-clone.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-656\" title=\"tortoise-git-clone\" src=\"http:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-clone-300x61.png\" alt=\"\" width=\"300\" height=\"61\" srcset=\"https:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-clone-300x61.png 300w, https:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-clone.png 354w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Im folgenden Dialog gibt man das SVN-Repository an und achtet darauf im unteren Bereich die Option &#8222;From SVN Repository&#8220; zu aktivieren.<\/p>\n<p><a href=\"http:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-clone-dlg.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-657\" title=\"tortoise-git-clone-dlg\" src=\"http:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-clone-dlg-300x226.png\" alt=\"\" width=\"300\" height=\"226\" srcset=\"https:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-clone-dlg-300x226.png 300w, https:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-clone-dlg.png 495w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><span style=\"text-decoration: underline;\"><em>Wichtig:<\/em><\/span> Wenn auf ein SVN-Repo zugegriffen wird, das beim Commit eine Authentifizierung erwartet, dann sollte man den Usernamen schon beim Clonen mit angeben (im Dialog unten rechts). Sp\u00e4ter erscheint nur noch eine Passwortabfrage und wenn vorher kein Nutzer angegeben wurde, dann verwendet das System den Usernamen vom OS-Login. In der Version 1.7.3 von TortoiseGit habe ich keine M\u00f6glichkeit gefunden, den Usernamen nachtr\u00e4glich anzupassen. Der Benutzername und das Passwort werden von git-svn in einer Datei unter &#8222;%USERPROFILE%\\.subversion\\auth\\svn.simple&#8220; gespeichert. Aber manuell anlegen sollte man diese Datei nicht, und selbst bei \u00c4nderungen sollte man wissen was man tut.<\/p>\n<p>Ok, zur\u00fcck zum Test. Das Clonen startet direkt nach dem Klick auf &#8222;Ok&#8220;. Wenn dieser Vorgang abgeschlossen ist, stehen \u00fcber das Kontextmen\u00fc im Explorer weitere Funktionen zur Verf\u00fcgung. So kann man sich z.B. die Historie in einer grafischen Oberfl\u00e4che anschauen und vorgenommene \u00c4nderungen einsehen. Auch werden die Dateien mit einem kleinen Symbol \u00fcberlagert, so dass man direkt im Explorer ge\u00e4nderte oder hinzugekommene Dateien erkennen kann. Wer TortoiseSVN kennt, wird sich recht schnell zurechfinden.<\/p>\n<p><a href=\"http:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-menu1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-660\" title=\"tortoise-git-menu\" src=\"http:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-menu1-272x300.png\" alt=\"\" width=\"272\" height=\"300\" srcset=\"https:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-menu1-272x300.png 272w, https:\/\/blog.speedyj.de\/wp-content\/uploads\/2011\/09\/tortoise-git-menu1.png 544w\" sizes=\"auto, (max-width: 272px) 100vw, 272px\" \/><\/a>Im Men\u00fc finden sich alle Aktionen wieder, die wir vorher auch schon in das Git-Bash ausgef\u00fchrt haben. Das sind:<\/p>\n<p style=\"padding-left: 30px;\"><em>Git Commit<\/em><br \/>\n\u00c4nderungen ins Git-Repo speichern<\/p>\n<p style=\"padding-left: 30px;\"><em>SVN DCommit<\/em><br \/>\n\u00c4nderungen aus dem Git-Repo in das SVN-Repo \u00fcbertragen<\/p>\n<p style=\"padding-left: 30px;\"><em>SVN Rebase<\/em><br \/>\n\u00c4nderungen aus dem SVN-Repo ins lokale Git-Repo holen<\/p>\n<p style=\"padding-left: 30px;\"><em>Switch\/Checkout<\/em><br \/>\nZu einen anderen Branch\/Trunk\/Tag wechseln<\/p>\n<p><strong>Fazit<\/strong><\/p>\n<p>Immer wieder schreckt man vor Neuem zur\u00fcck. Zum einen aus Gewohnheit und zum anderen weil es einem eine Menge Zeit kosten kann. Doch mit Git und dessen Subversion-Unterst\u00fctzung sollte man auf keine Fall z\u00f6gern. Die Tools sind weitestgehend ausgereift und arbeiten problemlos mit Subversion zusammen. Gedanken sollte man sich kurz um die Zeilenumbr\u00fcche machen, um nicht sp\u00e4ter Schwierigkeiten mit anderen Nutzern zu bekommen. Auch ist das Thema SVN-Authentifizierung in TortoiseGit noch verbesserungsw\u00fcrdig. Mit der Arbeitsweise von Git sollte man sich auf jeden Fall vertraut machen. Irgendwann wechselt man mit Sicherheit komplett von SVN zu einem verteilten Versionsverwaltungssystem.<\/p>\n<p>Es gibt nat\u00fcrlich eine Reihe von Editoren und Tools, die eine direkte SVN-Integration unterst\u00fctzen. F\u00fcr die Gr\u00f6\u00dferen und Bekannteren gibt es auch Git-Integrationen. In manchen Bereichen sind die SVN-Integrationen jedoch im Funktionsumfang etwas voraus. Aber das kann sich ja noch \u00c4ndern und soll auch nicht Gegenstand dieses Artikels sein.<\/p>\n<p><strong>Links<\/strong><br \/>\n<a href=\"http:\/\/git-scm.com\/\" target=\"_blank\">Git-SCM<\/a><br \/>\n<a href=\"http:\/\/code.google.com\/p\/tortoisegit\/\" target=\"_blank\">TortoiseGit<\/a><br \/>\n<a href=\"http:\/\/git-scm.com\/book\/\" target=\"_blank\">ProGit Book<\/a><br \/>\n<a href=\"http:\/\/www.kernel.org\/pub\/software\/scm\/git\/docs\/\" target=\"_blank\">git Manual<\/a><br \/>\n<a href=\"http:\/\/www.kernel.org\/pub\/software\/scm\/git\/docs\/git-svn.html\" target=\"_blank\">git svn Manual<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Als Entwickler geh\u00f6rt das Verwenden einer Versionsverwaltung zur t\u00e4glichen Arbeit. In meinem Umfeld kommt dabei h\u00e4ufig (&#8222;noch&#8220;) Subversion (kurz &#8222;SVN&#8220;) zum Einsatz. Dabei handelt es sich um ein sogenanntes Zentrales Versionsverwaltungssystem, wo das Repository durch einen zentralen Server verwaltet wird. Viele Aktionen (wie z.B. die History-Funktion und Commit) ben\u00f6tigen somit Zugriff auf diesen Server. Anders [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,9],"tags":[],"class_list":["post-651","post","type-post","status-publish","format-standard","hentry","category-software","category-tools"],"_links":{"self":[{"href":"https:\/\/blog.speedyj.de\/index.php?rest_route=\/wp\/v2\/posts\/651","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.speedyj.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.speedyj.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.speedyj.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.speedyj.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=651"}],"version-history":[{"count":15,"href":"https:\/\/blog.speedyj.de\/index.php?rest_route=\/wp\/v2\/posts\/651\/revisions"}],"predecessor-version":[{"id":1323,"href":"https:\/\/blog.speedyj.de\/index.php?rest_route=\/wp\/v2\/posts\/651\/revisions\/1323"}],"wp:attachment":[{"href":"https:\/\/blog.speedyj.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=651"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.speedyj.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=651"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.speedyj.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=651"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}