\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