{"id":51,"date":"2007-08-15T17:20:29","date_gmt":"2007-08-15T15:20:29","guid":{"rendered":"http:\/\/www.final-memory.org\/?p=51"},"modified":"2007-08-15T17:25:21","modified_gmt":"2007-08-15T15:25:21","slug":"svn-via-shell-und-ssh","status":"publish","type":"post","link":"https:\/\/www.final-memory.org\/?p=51","title":{"rendered":"SVN via Shell und SSH"},"content":{"rendered":"<p>PPM Pr\u00fcfung \u00fcberstanden, aber nicht glorreich. Bestanden, aber mit einem fiesen Nachgeschmack&#8230;<\/p>\n<p>Als positives Gegenst\u00fcck m\u00f6chte ich hier kurz meine Erfahrungen mit <a href=\"http:\/\/subversion.tigris.org\/\">Subversion<\/a> zusammenfassen, die ich im bisherigen Verlauf der Arbeit an meiner Diplomarbeit gesammelt habe. In einem Satz: &#8220;Es funktioniert halt einfach!&#8221;<\/p>\n<p><strong>Einleitung<\/strong><\/p>\n<p>Ich habe kein spezielles Repository \u00fcber HTTP oder dergleichen aufgesetzt. Mein Ansatz geht von ein paar Pr\u00e4missen aus:<\/p>\n<ul>\n<li>Gearbeitet wird unter einem unixoiden Betriebssystem mit Shell (hier <a href=\"http:\/\/www.ubuntulinux.com\/\">Ubuntu Linux<\/a> in verschiedenen Varianten)<\/li>\n<li>Zugang \u00fcber die Shell reicht f\u00fcr das Arbeiten am Rechner mit dem Repository<\/li>\n<li>F\u00fcr Remotezugriff kann SSH verwendet werden<\/li>\n<li>Das Repository geh\u00f6rt mir selber, d.h. ich authentifiziere mich nicht weiter<\/li>\n<\/ul>\n<p>Das Repository richtet man da ein, wo Plattenplatz ist und Zugriff besteht. Das Tutorial verr\u00e4t, wie das geht. Wir nehmen nun an, wir haben ein Repository unter <em>$HOME\/SVN\/<\/em> auf unserem Server angelegt.<\/p>\n<p><strong>URI f\u00fcr SVN Repositories<\/strong><\/p>\n<p>Um im weiteren Verlauf auf das Repository zugreifen zu k\u00f6nnen, m\u00fcssen wir immer wieder die URI des Repositories angeben. Wenn wir direkt auf dem Server arbeiten, dann benutzt man einfach eine file:\/\/ URL der folgenden Form:<\/p>\n<ul>\n<li>file:\/\/Pfad\/VirtuellerPfad<\/li>\n<\/ul>\n<p>Der Pfad muss das f\u00fchrende Slash enthalten. Beispielsweise k\u00f6nnte die URI so aussehen: <em>file:\/\/\/home\/me\/SVN\/SomeProject\/<\/em><\/p>\n<p>F\u00fcr den Remotezugriff verwendet man eine URL mit dem speziellen Protokoll svn+ssh:\/\/, welches der Subversionclient f\u00fcr die Kommandozeile anbietet. Man baut sich eine \u00e4hnliche URL zusammen, wie man sie auch von SSH her kennt, inklusive Benutzer und Zielrechner:<\/p>\n<ul>\n<li>svn+ssh:\/\/username@hostname:Pfad\/VirtuellerPfad<\/li>\n<\/ul>\n<p>Beispielsweise so: <em>svn+ssh:\/\/me@meinserver.de:\/home\/me\/SVN\/SomeProject\/<\/em><\/p>\n<p>Man beachte das  SomeProject\/ ein virtueller Pfad ab der Wurzel des Repositories darstellt.<\/p>\n<p>Subversion fragt falls n\u00f6tig nach dem Passwort. Hier empfiehlt es sich massiv mit SSH-Keys (<a href=\"http:\/\/www.schlittermann.de\/doc\/ssh\">Anleitung<\/a>) zu arbeiten, da auf die Dauer die Passwortabfragen st\u00f6ren. Diese sind beim Remotezugriff f\u00fcr jedes Kommando anzugeben, was nat\u00fcrlich st\u00f6rt. Inwiefern man SSH-Keys als Sicherheitsrisiko einstuft, \u00fcberlasse ich dem Einzelnen, ggfs. bei <a href=\"http:\/\/www.mdiedrich.de\/\">Martin Diedrich<\/a> eine fundierte Meinung einholen <img decoding=\"async\" class=\"lmbbox_smileys_img\" src=\"http:\/\/www.final-memory.org\/wp-content\/plugins\/lmbbox-smileys\/smileys\/tb\/wink1.gif\" alt=\";)\" \/><\/p>\n<p><strong>Projekte auschecken<\/strong><\/p>\n<p>Wenn wir nun eine Arbeitskopie aus unserem Repository auschecken wollen, dann benutzen wir das folgende Kommando:<\/p>\n<ul>\n<li>svn checkout $URI\/Projekt<\/li>\n<\/ul>\n<p>Das erstellt dann ein Unterverzeichnis im lokalen Arbeitsverzeichnis, in dem man alle Arbeitsschritte erledigt.<\/p>\n<p>Aussehen kann das so:<\/p>\n<ul>\n<li>cd<\/li>\n<li>cd work<\/li>\n<li>svn checkout file:\/\/\/home\/me\/SVN\/megaleet\/<\/li>\n<li>cd megaleet<\/li>\n<li>&#8230;<\/li>\n<\/ul>\n<p>Das Auschecken muss mn nur einmal erledigen, im folgenden synchronisiert man nur die Arbeitskopie mit dem Repository und \u00fcbertr\u00e4gt nur die erfolgten \u00c4nderungen.<\/p>\n<p><strong>Der Arbeitszyklus<\/strong><\/p>\n<p>Gearbeitet wird im Verzeichnis der Arbeitskopie. Bevor man mit dem Arbeiten beginnt, sollte man sich den aktuellen Stand des Projektes aus dem Repository herunterladen. So bekommen wir die \u00c4nderungen von Teamkollegen gleich mit und insbesondere verheddern wir uns nicht, wenn man an zwei Arbeitspl\u00e4tzen Arbeitskopien hat (z.B. wie ich daheim und im Labor).<\/p>\n<ul>\n<li>cd &lt;Verzeichnis der Arbeitskopie&gt;<\/li>\n<li>svn update<\/li>\n<\/ul>\n<p>Jetzt k\u00f6nnen wir fleissig Dateien in der Arbeitskopie bearbeiten und ver\u00e4ndern. Im Gegensatz zu CVS funktioniert das auch mit Bin\u00e4rdateien, z.B. Bildern gut. Sind wir mit der Arbeit fertig, so k\u00f6nnen wir den aktuellen Stand der Arbeit im Repository abgleichen. Dazu f\u00fchren wir den sogenannten Commit aus, der unsere \u00c4nderungen in das Repository \u00fcbertr\u00e4gt.<\/p>\n<ul>\n<li>svn commit<\/li>\n<\/ul>\n<p>Subversion macht auch $EDITOR (w\u00f6rtlich gemeint, Default is meistens vi) auf und erlaubt uns so einen Kommentar zur \u00c4nderung einzugeben.<\/p>\n<p>Prinzipiell ist es m\u00f6glich auf jeden Stand wieder zur\u00fcckzugehen, der einmal ins Repository eingecheckt wurde. Ebenso ist Branching m\u00f6glich, aber diese fortgeschrittenen Anwendungsf\u00e4lle m\u00f6chte ich hier nicht behandeln.<\/p>\n<p><strong>Dateien zum Repository hinzuf\u00fcgen<\/strong><\/p>\n<p>Nehmen wir an, wir wollen eine neue Quelldatei zu unserem Repository hinzuf\u00fcgen. Dazu wird diese Datei zun\u00e4chst erstellt und anschlie\u00dfend dem Repository bekanntgemacht. Mit dem n\u00e4chsten Commit ist dann die Daei im Repository vorhanden.<\/p>\n<ul>\n<li>cd &lt;Verzeichnis der Arbeitskopie&gt;<\/li>\n<li>svn add &lt;tolle files&gt;<\/li>\n<li>svn commit<\/li>\n<\/ul>\n<ul><\/ul>\n<p>L\u00f6schen und Umbenennen ist ebenfalls m\u00f6glich, ich empfehle ein Studium der Dokumentation zu Subversion f\u00fcr n\u00e4here Informationen.<br \/>\n<strong>Neues Projekt in das Repository aufnehmen<\/strong><\/p>\n<p>Wenn wir ein neues Projekt in unser Repository aufnehmen wollen, dann gehen wir wie folgt vor:<\/p>\n<ul>\n<li>Projektstruktur erstellen (Verzeichnisse, erste Dateien)<\/li>\n<li>svn import &lt;Verzeichnis des neuen Projektes&gt; $URI\/Projektname\/<\/li>\n<\/ul>\n<p>Das Projekt wird jetzt importiert. Dazu zwei Anmerkungen:<\/p>\n<ul>\n<li>Die Angabe des Unterprojektes in der Repository-URI ist wichtig, da sonst nur flache Files importiert werden.<\/li>\n<li>Das importierte Verzeichnis gilt nicht als Arbeitskopie, eine solche muss erst wieder ausgecheckt werden.<\/li>\n<\/ul>\n<p>Ein Beispiel verdeutlicht das Vorgehen:<\/p>\n<p>Sei <em>$HOME\/work\/someproject\/<\/em> das Projektverzeichnis, welches in das Repository aufgenommen werden soll.<\/p>\n<ul>\n<li>cd $HOME\/work\/<\/li>\n<li>svn import someproject\/ <em>file:\/\/\/home\/me\/SVN\/someproject\/<\/em><\/li>\n<li>mv someproject someproject_old\/ &lt;- das Verzeichnis ist noch keine Arbeitskopie<\/li>\n<li>svn checkout <em>file:\/\/\/home\/me\/SVN\/someproject\/<\/em><\/li>\n<li>cd someproject<\/li>\n<li>&#8230;arbeiten im Projekt<\/li>\n<li>svn commit<\/li>\n<\/ul>\n<p>Analog k\u00f6nnen nat\u00fcrlich auch URIs f\u00fcr eine SSH-Verbindung angegeben werden.<\/p>\n<p><strong>Backup des Repositories<\/strong><\/p>\n<p>Ein einfaches Backup  des Repositories ist m\u00f6glich.Dazu ist einfach das Verzeichnis des Repositories mit tar einzupacken:<\/p>\n<ul>\n<li>tar cvzf ~\/SVN_Backup.tgz ~\/SVN\/<\/li>\n<\/ul>\n<p>Zur Wiederherstellung wird das Backup dann einfach ausgepackt.<br \/>\nF\u00fcr weitere Informationen zu Subversion empfehle ich auf der <a href=\"http:\/\/subversion.tigris.org\/\">Webseite von Subversion<\/a> zu schm\u00f6ckern. Es lohnt sich <img decoding=\"async\" class=\"lmbbox_smileys_img\" src=\"http:\/\/www.final-memory.org\/wp-content\/plugins\/lmbbox-smileys\/smileys\/tb\/smile1.gif\" alt=\":)\" \/><\/p>\n<div id=\"facebook_like\"><iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.final-memory.org%2F%3Fp%3D51&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80\" scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:500px; height:80px;\" allowTransparency=\"true\"><\/iframe><\/div>","protected":false},"excerpt":{"rendered":"<p>PPM Pr\u00fcfung \u00fcberstanden, aber nicht glorreich. Bestanden, aber mit einem fiesen Nachgeschmack&#8230; Als positives Gegenst\u00fcck m\u00f6chte ich hier kurz meine Erfahrungen mit Subversion zusammenfassen, die ich im bisherigen Verlauf der Arbeit an meiner Diplomarbeit gesammelt habe. In einem Satz: &#8220;Es funktioniert halt einfach!&#8221; Einleitung Ich habe kein spezielles Repository \u00fcber HTTP oder dergleichen aufgesetzt. Mein &hellip; <a href=\"https:\/\/www.final-memory.org\/?p=51\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;SVN via Shell und SSH&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,22],"tags":[],"class_list":["post-51","post","type-post","status-publish","format-standard","hentry","category-linux","category-studium"],"_links":{"self":[{"href":"https:\/\/www.final-memory.org\/index.php?rest_route=\/wp\/v2\/posts\/51","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.final-memory.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.final-memory.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.final-memory.org\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.final-memory.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=51"}],"version-history":[{"count":0,"href":"https:\/\/www.final-memory.org\/index.php?rest_route=\/wp\/v2\/posts\/51\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.final-memory.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=51"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.final-memory.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=51"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.final-memory.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=51"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}