\documentclass[12pt]{beamer} \usepackage{amsmath} \usepackage{url} \usepackage{ucs} \usepackage[utf8x]{inputenc} \usepackage[ngerman]{babel} % Manual syntax highlighting \newcommand{\synfunc} [1]{\color{blue!50!black}#1\color{black}} \newcommand{\synstr} [1]{\color{red!50!black}#1\color{black}} \newcommand{\synvar} [1]{\color{purple!50!black}#1\color{black}} \newcommand{\synclass} [1]{\color{green!50!black}#1\color{black}} \newcommand{\syncomment}[1]{\color{blue!20!black}#1\color{black}} \newcommand{\syncool} [1]{\color{beamer@blendedblue}#1\color{black}} \newcommand{\synoder} {\ \ \color{black}$\vee$\ \ } \newcommand{\hr} {\rule[4pt]{\textwidth}{0.1pt}\\} \title{Versionskontrolle mit SVK} \author{Ingo Blechschmidt \\\texttt{<iblech@web.de>}} \institute{LUGA} \date{1. Februar 2006} \usetheme{Warsaw} \usecolortheme{seahorse} %\usepackage{bookman} \setbeamercovered{transparent} \begin{document} \frame{\titlepage} \frame[t]{ \frametitle{Inhalt} \tableofcontents } \section{Versionskontrolle} \frame[t]{\frametitle{Versionskontrolle} \begin{itemize} \item Generell: Verfolgen von Versionen/Änderungen \item "`Was habe ich damals geändert?"' \item "`Was hat \texttt{\$PERSON} damals geändert?"' \end{itemize} } \subsection{Grundidee} \frame[t]{\frametitle{Grundidee} \begin{itemize} \item Dateiverwaltung durchs Versionskontrollsystem \item Damit möglich: \begin{itemize} \item Rückkehr zu früheren Ständen \item Genaue Buchführung ("`wieso habe ich das gleich nochmal geändert?"') \item Mehrgleisige Entwicklung (Zweige (branches)) \end{itemize} \end{itemize} \vfill \begin{block}{Mögliche Einsatzzwecke} \begin{itemize} \item Programmierung \item \texttt{/etc} \item \texttt{\$WICHTIGE\_ARBEIT}, \texttt{\$WICHTIGES\_DOKUMENT} \end{itemize} \end{block} } \subsection{Geschichte} \frame[t]{\frametitle{Geschichte} \vspace*{-1em}\hspace*{3em}\vbox{\begin{columns}[t] \column{5cm} \begin{itemize} \item[Vor 1972] \textbf<1>{cp} % \item[1972] SCCS \item[1982] \textbf<2>{RCS} \item[1992] \textbf<3-4>{CVS} \end{itemize} \column{5cm} \begin{itemize} \item[2002] \textbf<5-6>{Subversion (SVN)} \item[2003] SVK \end{itemize} \end{columns}} \only<1>{\begin{block}{cp} \texttt{% \$ \synfunc{cp}\ \synstr{datei}\ \synstr{datei.2006-01-31}\ \ \syncomment{\# Backup}\\ \$ \synvar{\$EDITOR}\ \synstr{datei} \\ \$ \ldots\\ \syncomment{\# Oh! Irgendwas ging schief!}\\ \$ \synfunc{mv}\ \synstr{datei.2006-01-31}\ \synstr{datei}\ \ \syncomment{\# Revert} } \end{block}} \only<2>{\begin{block}{RCS} \texttt{% \$ \synfunc{ci}\ \ \ datei\ \ \syncomment{\# Checkin}\\ \$ \synfunc{co}\ \ \ datei\ \ \syncomment{\# Checkout}\\ \$ \synfunc{rlog}\ datei\ \ \syncomment{\# Log ansehen} } Aber: Keine Möglichkeit der Zusammenarbeit \end{block}} \only<3-4>{\begin{block}{CVS} \only<3>{ \texttt{% \$ \synfunc{cvs ci}\ \ datei\ \ \syncomment{\# Checkin}\\ \$ \synfunc{cvs co}\ \ datei\ \ \syncomment{\# Checkout}\\ \$ \synfunc{cvs log}\ datei\ \ \syncomment{\# Log ansehen} } \begin{itemize} \item Aufsatz auf RCS (zuerst pure Shellskripte, später C) \item (Teils große) Probleme beim Umgang mit Verzeichnissen und Umbenennung \item Geringe Performance \end{itemize} } \only<4>{ \begin{center}{\Large ``You hate it and then it hates back''}\end{center} \texttt{% \$ \synfunc{cat}\ \synstr{-n}\ \synstr{cvs/src/server.c}\\ 5878\ \ \ \ \ \ \ \synfunc{goto}\ \synstr{i\_hate\_you};\\ \ldots\\ 5898\ \ \ \synvar{i\_hate\_you}:\\ 5899\ \ \ \ \ \ \ \synfunc{printf}\ (\synstr{"{}I HATE YOU\textbackslash{}n"{}});\\ 5900\ \ \ \ \ \ \ \synfunc{fflush}\ (\synvar{stdout}); } } \end{block}} \only<5-6>{\begin{block}{Subversion} \only<5>{ \texttt{% \$ \synfunc{svn ci}\ \ datei\ \ \syncomment{\# Checkin}\\ \$ \synfunc{svn co}\ \ datei\ \ \syncomment{\# Checkout}\\ \$ \synfunc{svn log}\ datei\ \ \syncomment{\# Log ansehen} } \begin{itemize} \item Neuentwicklung \item Versionierte Verzeichnisse; Umbenennungen \item Atomare Commits \item Anzeige von Unterschieden (diffs) auch ohne Server \end{itemize} } \only<6>{ \begin{center}{\Large ``Disks are cheap, bandwidth is expensive''}\end{center} } \end{block}} } \frame[t]{\frametitle{Alternativen} \begin{itemize} \item Perforce (schnell, kommerziell, zentraler Aufbau) \item Bitkeeper (\ldots\!) \item Darcs (noch langsam) \item Arch (langsam, ``insist[s] on some concrete in your brain'') \item Bazaar-NG (von Canonical (Ubuntu)) \item Monotone, Aegis, \ldots \end{itemize} } \subsection{Entwicklung} \frame[t]{\frametitle{Entwicklung} \begin{itemize} \item RCS: 1982, SVN: 2002 \item Voraussetzungen für Open-Source-Entwicklung: \begin{itemize} \item Fähige Programmierer \item Freude oder Not (oder Geld) \end{itemize} \item Probleme: \begin{itemize} \item Versionskontrollprogrammierung macht wenig Spaß \item Abfinden mit vorhandenen Lösungen \end{itemize} \end{itemize} } \section{SVK} \subsection{Entwicklung} \frame[t]{\frametitle{Entwicklung} \begin{itemize} \item Initiator: Chia-liang Kao (clkao) \item ``Screw it! I am going to take one year off and make my life easier in the future'' -- clkao, September 2003 \end{itemize} \begin{block}{Mottos von SVK} \begin{itemize} \item ``Disks are cheap, bandwidth is \textsl{very} expensive'' \item Faulheit, Do What I Mean (DWIM) \end{itemize} \end{block} } \subsection{Design} \frame[t]{\frametitle{Design} \begin{itemize} \item Zugriff auf unterschiedliche Versionskontrollsysteme (Subversion, git, CVS, Perforce, \ldots) \item Verteilung, Dezentralität: \\ Kein zentraler Server, flexible Patch-Verwaltung \item {\small\url{http://perlcabal.org/~autrijus/svk-overview.png}} \item Lokales Repository auf Subversion-Basis \\ (Performance! Robustheit!) \end{itemize} \pause \begin{block}{Arbeitsweise beim Umgang mit entfernten Repositories} \begin{enumerate} \item Mirrorn eines entfernten Repositories \item Arbeiten im lokalen Mirror, Internetverbindung nicht erforderlich \item Zurückschieben der Änderungen ins entfernte Repository \end{enumerate} \end{block} } \subsection{Praxis: Single-User-SVK} \frame[t]{\frametitle{Praxis: Single-User-SVK} \begin{enumerate} \item Importieren eines vorhandenen Verzeichnisbaums \texttt{% \$ \synfunc{svk import}\ \synstr{--to-checkout}\ \symbol{92}\\ \ \ \ \ \synstr{//\textsl{grtz}}\ \synstr{/home/iblech/\textsl{grtz}} } \pause \item Arbeiten \item Ende eines Arbeitsblocks; Einchecken (checkin, commit) \texttt{% \$ \synfunc{svk ci} } \pause \item "`Wieso hab ich das doch gleich gemacht?"' \texttt{% \$ \synfunc{svk log}\ \synstr{foo.yml} } \pause \item "`Wie war das doch nochmal vor einer Woche?"' \texttt{% \$ \synfunc{svk update}\ \synstr{-r '\{\textsl{YYYY}-\textsl{MM}-\textsl{DD}\}'}\\ \syncomment{\# Oder, kürzer:}\\ \$ \synfunc{svk up}\ \synstr{-r '\{\textsl{YYYY}-\textsl{MM}-\textsl{DD}\}'}\\ } \end{enumerate} } \frame[t]{\frametitle{Kommandoübersicht} \begin{tabular}{ll} \texttt{\synfunc{svk ci}} & Einchecken \\ \texttt{\synfunc{svk log}} & Log ansehen \\ \texttt{\synfunc{svk update}\ \synstr{-r \ldots}} & Zu bestimmter Version zurückkehren \\ \texttt{\synfunc{svk update}}, \texttt{\synfunc{svk up}} & Zu neuester Version zurückkehren \\ \\ \texttt{\synfunc{svk diff}} & Unterschiede (diff) anzeigen \\ \\ \texttt{\synfunc{svk add}\ \synstr{\ldots}} & Datei oder Verzeichnis zum Repository \\ & hinzufügen \\ \texttt{\synfunc{svk rm}\ \synstr{\ldots}} & Datei oder Verzeichnis löschen \\ \texttt{\synfunc{svk cp}\ \synstr{\ldots}\ \synstr{\ldots}} & Datei oder Verzeichnis kopieren \\ \texttt{\synfunc{svk mv}\ \synstr{\ldots}\ \synstr{\ldots}} & Datei oder Verzeichnis \\ & verschieben/umbenennen \\ \end{tabular} } \section{Siehe auch} \frame[t]{\frametitle{Siehe auch} \begin{itemize} \item \url{http://svk.elixus.org/} \item \url{http://svkbook.elixus.org/} \item {\scriptsize\url{http://opensource.fotango.com/~clkao/svk-intro/start.html}} \\ svk -- Version Control without the Headaches (clkao) \item {\footnotesize\url{http://utsl.gen.nz/talks/svn-svk/slides/start.html}} \\ Upgrading your development to svk and svl via svn (Sam~Vilain) \end{itemize} \only<2>{\vfill\begin{center}\Huge Fragen?\end{center}} } \appendix \section{\appendixname} \frame{\begin{center}\Huge Bonus-Slides\end{center} \tableofcontents} \subsection{Revisionen bei Subversion und SVK} \frame[t]{\frametitle{Revisionen bei Subversion und SVK} \begin{itemize} \item Markierung eines bestimmten Zeitpunkts durch eine Revisionsnummer \item Erfassung immer \textsl{aller} Dateien durch eine Revisionsnummer \end{itemize} \pause \begin{block}{Beispiel} \begin{enumerate} \item Aktuelle Revision: 42; vorhandene Dateien: \texttt{grtz}, \texttt{baka} \item Modifikation von \texttt{grtz}, \texttt{svk ci} \item Nun aktuelle Revision: 43 \item Revision von \texttt{grtz}: 43 \item Revision von \texttt{baka}: trotz Ausbleiben von Änderungen an \texttt{baka} ebenfalls 43 (Gegensatz zu CVS!) \end{enumerate} \end{block} } \subsection{Zweige, Tags und Trunk} \frame[t]{\frametitle{Zweige, Tags und Trunk} \begin{itemize} \item Bei Subversion und SVK \textsl{keine} spezielle Behandlung von Zweigen, Tags und Trunk \item Stattdessen: Zweige, Tags und Trunk nur als Verzeichnisse: \hspace*{4em}\vbox{\begin{itemize} \item[\texttt{//\textsl{grtz}/trunk}] Trunk \item[\texttt{//\textsl{grtz}/tags}] Verzeichnis für Tags \item[\texttt{//\textsl{grtz}/branches}] Verzeichnis für Zweige \end{itemize}} \vspace*{-0.6em} \item Keine Sonderbehandlung dieser Verzeichnisse! \end{itemize} } \frame[t]{\frametitle{Zweige, Tags und Trunk} \footnotesize\begin{enumerate} \item Anlegen der Verzeichnisstruktur \texttt{% \$ \synfunc{svk mkdir}\ \synvar{//\textsl{grtz}/trunk}\\ \$ \synfunc{svk mkdir}\ \synvar{//\textsl{grtz}/tags}\\ \$ \synfunc{svk mkdir}\ \synvar{//\textsl{grtz}/branches} } \item Arbeiten in \texttt{//\textsl{grtz}/trunk/} \pause \item Taggen des aktuellen Trunks als \texttt{\textsl{release-3.141}} \texttt{% \$ \synfunc{svk cp}\ \synvar{//\textsl{grtz}/trunk}\ \synvar{//\textsl{grtz}/tags/\textsl{release-3.141}} } \pause \item Weiterarbeiten in \texttt{//\textsl{grtz}/trunk/} \item Erzeugen des Zweigs \texttt{foobs} aus\ldots \texttt{% \syncomment{\# \ldots dem aktuellen Trunk}\\ \$ \synfunc{svk cp}\ \synvar{//\textsl{grtz}/trunk}\ \synvar{//\textsl{grtz}/branches/foobs}\\ \syncomment{\# \ldots \textsl{release-3.141}}\\ \$ \synfunc{svk cp}\ \symbol{92}\\ \ \ \ \ \synvar{//\textsl{grtz}/tags/\textsl{release-3.141}}\ \synvar{//\textsl{grtz}/branches/foobs} } \end{enumerate} } \subsection{Zugriff auf entfernte Repositories mit SVK} \frame[t]{\frametitle{Zugriff auf entfernte Repositories mit SVK} \begin{enumerate} \item Mirrorn und Auschecken des entfernten Repositories \texttt{% \$ \synfunc{svk cp}\ \synstr{svn://svn.openfoundry.org/pugs}\ \synstr{pugs} } \pause \item Arbeiten (auch ohne Internetverbindung) \item Ende eines Arbeitsblocks; lokales (!) Einchecken (ebenfalls ohne Internetverbindung) \texttt{% \$ \synfunc{svk ci} } \pause \item Hochschieben der Änderungen zum entfernten Repository \texttt{% \syncomment{\# Pro lokalem Commit ein entfernter Commit:}\\ \$ \synfunc{svk push}\\ \syncomment{\# Oder alle lokalen Commits in einem Commit}\\ \syncomment{\# zum Server schicken:}\\ \$ \synfunc{svk push}\ \synstr{-l}\\ } \pause \item Änderungen aus dem entfernten Repository holen \texttt{% \$ \synfunc{svk pull} } \end{enumerate} } % http://opensource.fotango.com/~clkao/svk-intro/slide11e.html#end % http://utsl.gen.nz/talks/svn-svk/slides/index.html \end{document}
Download