Compare commits

...

8 Commits

  1. 330
      Git.tex
  2. 11
      README.md

330
Git.tex

@ -390,41 +390,43 @@ sollte nat"urlich "uber LAN (und nicht via WLAN) mit dem Netz verbunden sein, da
Daten"ubertragung m"oglichst hastig erfolgen kann. Eine FritzBox zum Beispiel hat
Gigabitinterfaces, da kann man schon mal gut was "uber die Leitung jagen (wobei des Raspberries
Interface langsamer ist).\\
Als GIT-Serversoftware empfehle ich an dieser Stelle gogs\footnote{https://gogs.io/}.\\
Als GIT-Serversoftware empfehle ich an dieser Stelle gitea\footnote{https://gitea.io/}.\\
Wenn du dich damit besch"aftigen willst, solltest du aber "uber gute Linuxkenntnisse
verf"ugen.\\
Mit gogs hast du eine Weboberfl"ache, "ahnlich wie bei GitHub, unter der du deine Projekte
Mit gitea hast du eine Weboberfl"ache, "ahnlich wie bei GitHub, unter der du deine Projekte
recht einfach verwalten kannst. Du hast auch die M"oglichkeit, private Projekte dort anzulegen
und mit Hilfe der Benutzerverwaltung kannst du auch Einfluss darauf nehmen, was deine Teammitgleider
alles so d"urfen.
\subsection{gogs}
Gogs ist ein kleines, aber feines Projekt, das ein Webfrontend f"ur einen git-Server bereitstellt.
\subsection{gitea}
Gitea ist ein kleines, aber feines Projekt, das ein Webfrontend f"ur einen git-Server bereitstellt.
Es ist in der Programmiersprache go geschrieben und ben"otigt nur minimale Resourcen.
\subsubsection{Vorbereiten der Datenbank}
Bevor du dir gogs herunterl"adst und installierst, solltest du das Datenbanksystem
ausw"ahlen, das gogs sp"ater benutzen soll. Du kannst zwischen MariaDB/MySQL und PostgreSQL
w"ahlen. Gut, es giobt noch SQLite, MSSQL oder TiDB nutzen, aber die ersten beiden will man
Bevor du dir gitea herunterl"adst und installierst, solltest du das Datenbanksystem
ausw"ahlen, das gitea sp"ater benutzen soll. Du kannst zwischen MariaDB/MySQL und PostgreSQL
w"ahlen. Gut, es gibt noch SQLite, MSSQL oder TiDB nutzen, aber die ersten beiden will man
nicht wirklich und TiDB ist wohl noch zu speziell. Achte darauf, dass MySQL/MariaDB auch
tats"achlich auf dem Netzwerkinterface horcht, das du bei der Installation angibst!\\
\paragraph{PostgreSQL}
Am einfachsten loggst du dich per ``sudo su - postgres'' als Benutzer postgres in deiner
Shell auf deinem GIT-Server ein, dann erzeugst du per ``createuser -P -d gogs'' einen Benutzer
f"ur die Datenbank ``gogs''.\\
Im n"achsten Schritt loggst du dich auf der Shell per ``psql -h localhost template1 gogs''
in das Datenbanksystem ein. Hier reicht nun ein ``CREATE DATABASE gogs;'', um die Datenbank
f"ur gogs anzulegen.
Shell auf deinem GIT-Server ein, dann erzeugst du per ``createuser -P -d gitea'' einen Benutzer
f"ur die Datenbank ``gitea''.\\
Im n"achsten Schritt loggst du dich auf der Shell per ``psql -h localhost template1 gitea''
in das Datenbanksystem ein. Hier reicht nun ein ``CREATE DATABASE gitea;'', um die Datenbank
f"ur gitea anzulegen.
\paragraph{MariaDB/MySQL}
Du loggst dich mit dem administrativen Benutzer in MariaDB/MySQL, den du bei der Installation
eingerichtet hast, in das Datenbanksystem ein. Das ist oft der Datenbankbenutzer ``root''
(nicht zu verwechseln mit dem Systembenutzer ``root''). Also ``mysql -p -u root''. Nun
erfolgt ein ``GRANT ALL PRIVILEGES ON gogs.* to 'gogs'@'localhost' IDENTIFIED BY
'geheimes passwort';''. Dann loggst du dich aus, loggst dich per ``mysql -p -u gogs''
wieder ein und f"uhrst ein ``CREATE DATABASE gogs CHARACTER SET utf8mb4;'' aus,
um die Datenbank f"ur gogs anzulegen.
erfolgt ein ``GRANT ALL PRIVILEGES ON gitea.* to 'gitea'@'localhost' IDENTIFIED BY
'geheimes passwort';''. Dann loggst du dich aus, loggst dich per ``mysql -p -u gitea''
wieder ein und f"uhrst ein ``CREATE DATABASE gitea CHARACTER SET utf8mb4;'' aus,
um die Datenbank f"ur gitea anzulegen.
\\
\textbf{Hinweis:} Sollte bei Benutzung von MariaDB w"ahrend der Installation im
Webbrowser die Fehlermeldung ``Datenbankeinstellungen sind nicht korrekt: Error 1071: Specified key was too long; max key length is 767 bytes'', dann folgende Befehle in der
@ -437,20 +439,195 @@ set global innodb_file_format=Barracuda;
\subsubsection{Installation}
Bevor du dir gleich die Software runterl"adst, lege bitte einen Benutzer ``git'' auf deinem
Server an, sofern der Benutzer noch nicht existiert.\\
Von https://gogs.io/docs/installation/install\_from\_binary l"adt man sich die passende Version
Von https://gitea.io/ l"adt man sich die passende Version
f"ur seinen Server runter und entpackt diese. Das entstandene Verzeichnis wird dann in das
Benutzerverzeichnis des Benutzers ``git'' verschoben und diesem zu eigen gemacht (chown).\\
Im Verzeichnis gogs/scripts findest du Beispiele, um gogs auf deinem System bei Systemstart
automatisch zu starten. Das geht zum Beispiel via init oder systemd.\\
Um gitea beim Systemstart zu starten, benötigst du die passenden Skripte.\\
Nat"urlich solltest du die Dateien entsprechend f"ur dein System anpassen, sonst stimmen
die Pfade unter Umst"anden nicht.
\paragraph{systemd}
In ``/etc/systemd/system/'' legst du (z.B. mit vim) die Datei ``gitea.service'' mit
folgendem Inhalt an:
\begin{verbatim}
[Unit]
Description=Gitea
After=syslog.target
After=network.target
After=mariadb.service mysqld.service postgresql.service
After=memcached.service redis.service
[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/gitea
ExecStart=/home/git/gitea/gitea web
Restart=always
Environment=USER=git HOME=/home/git
[Install]
WantedBy=multi-user.target
\end{verbatim}
Dann folgen ein ``systemctl enable gitea'', danach ein ``systemctl start gitea''.
\paragraph{SystemV init}
Es gibt ja immer noch Puristen, die das alte init-System
von SystemV verwenden. Dafür benötigt man die Datei
``/etc/init.d/gitea'', die Executrechte benötigt.
\begin{verbatim}
#! /bin/sh
### BEGIN INIT INFO
# Provides: gitea
# Required-Start: $syslog $network
# Required-Stop: $syslog
# Should-Start: mysql postgresql
# Should-Stop: mysql postgresql
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: A self-hosted Git service written in Go.
# Description: A self-hosted Git service written in Go.
### END INIT INFO
# Author: Danny Boisvert
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Gitea"
NAME=gitea
SERVICEVERBOSE=yes
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
WORKINGDIR=/home/git/gitea
DAEMON=$WORKINGDIR/$NAME
DAEMON_ARGS="web"
USER=git
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
sh -c "USER=$USER start-stop-daemon --start --quiet \\
--pidfile $PIDFILE --make-pidfile \\
--test --chdir $WORKINGDIR --chuid $USER \\
--exec $DAEMON -- $DAEMON_ARGS > /dev/null \\
|| return 1"
sh -c "USER=$USER start-stop-daemon --start --quiet \\
--pidfile $PIDFILE --make-pidfile \\
--background --chdir $WORKINGDIR --chuid $USER \\
--exec $DAEMON -- $DAEMON_ARGS \\
|| return 2"
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/1/KILL/5 \\
--pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
start-stop-daemon --stop --quiet --oknodo \\
--retry=0/1/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
case "$1" in
start)
[ "$SERVICEVERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$SERVICEVERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$SERVICEVERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$SERVICEVERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$SERVICEVERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$SERVICEVERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
\end{verbatim}
Um das Skript zu aktivieren, führt man ``update-rc.d gitea defaults'' aus und
startet gitea per ``/etc/init.d/gitea start''.
\subsubsection{Konfigurationsdatei}
Um sp"ater noch ein wenig Feintuning vorzunehmen, kann man im Verzeichnis ``custom/conf''
die Datei ``app.ini'' "andern, die bei der Installation automatisch angelegt wird.\\
Ein Beispiel f"ur eine app.ini:
\begin{verbatim}
APP_NAME = Gogs
APP_NAME = Gitea
RUN_USER = git
RUN_MODE = prod
@ -460,11 +637,11 @@ ROOT = /home/git/repositories
[database]
DB_TYPE = postgres
HOST = 127.0.0.1:5432
NAME = gogs
USER = gogs
NAME = gitea
USER = gitea
PASSWD = GEHEIM
SSL_MODE = disable
PATH = data/gogs.db
PATH = data/gitea.db
[server]
DOMAIN = git.hauke-zuehl.de
@ -495,7 +672,7 @@ PROVIDER = file
[log]
MODE = file
LEVEL = Info
ROOT_PATH = /home/git/gogs/log
ROOT_PATH = /home/git/gitea/log
[security]
INSTALL_LOCK = true
@ -508,20 +685,29 @@ kannst aber gerne MariaDB oder MySQL verwenden.
\subsubsection{Der erste Start}
Du startest gogs zun"achst "uber die Kommandozeil per ``./gogs web'' und gibst dann in
Du startest gitea zun"achst "uber die Kommandozeil per ``./gitea web'' und gibst dann in
deinem Webbrowser die URL ``http://localhost:3000'' ein.\\
Du wirst nun durch die Konfiguration der Datenbank und von gogs gef"uhrt. Bei der Domain
Du wirst nun durch die Konfiguration der Datenbank und von gitea gef"uhrt. Bei der Domain
solltest du den Server- oder einen ordentlichen Domainnamen eingeben. Hast du also zum
Beispiel einen kleinen RaspberryPi zu Hause, auf dem gogs laufen soll, und dieser heisst
Beispiel einen kleinen RaspberryPi zu Hause, auf dem gitea laufen soll, und dieser heisst
``pi.deinzuhause.net'' dann gibst du eben diesen Namen bei der Domain und der Application
URL ein.\\
Den Datenbankbenutzer f"ur gogs und die entsprechende Datenbank solltest du nun auch
Den Datenbankbenutzer f"ur gitea und die entsprechende Datenbank solltest du nun auch
anlegen, sonst kracht es bei der Einrichtung der Tabellen.\\
Hast du soweit alles eingetragen, kannst du dich anmelden und deine Projekte mit gogs
Hast du soweit alles eingetragen, kannst du dich anmelden und deine Projekte mit gitea
verwalten.\\
Der erste Benutzer, der sich registriert bei gogs, wird "ubrigens als Administrator
angelegt, also Obacht! Von nun kannst du gogs in aller Ruhe erforschen und
eigene Repositores anlegen, Organiosationen und Teams erzeugen, usw.!
Der erste Benutzer, der sich registriert bei gitea, wird "ubrigens als Administrator
angelegt, also Obacht! Von nun kannst du gitea in aller Ruhe erforschen und
eigene Repositores anlegen, Organisationen und Teams erzeugen, usw.!
\subsection{Gogs}
Gitea ist ein sog. ``fork'' von gogs, d.h, jemand fand die Entwicklung von gogs nicht so
toll, hat das Projekt geklont und fortgeführt.\\
\\
Gogs dagegen ist zur Zeit ein wenig eingeschlafen, sodass hier nicht weiter darauf eingegangen wird.
Wer aber gogs verwenden möge, kann dies nach der Installationsanleitung von
gitea durchführen.
\section{GIT from scratch}
Ich habe keine bessere "Uberschrift gefunden, aber wenn du keine Lust auf GitHub oder gogs oder
@ -945,7 +1131,7 @@ Wenn ich das alles gemacht habe, sieht der Verzeichnisbaum so aus:
Du siehst den Unterschied!\\
Git w"urde jetzt also alle ``neuen'' Datein unterhalb von build finden
Git w"urde jetzt also alle ``neuen'' Dateien unterhalb von build finden
und nat"urlich daraus schliessen, dass man diese auch ins Repo
aufnehmen will:
\begin{verbatim}
@ -1000,6 +1186,84 @@ uninteressant oder unwichtig sind. Diese k"onnen dann nach
und nach in die .gitignore aufgenommen werden, wobei nat"urlich
auch Wildcards verwendet werden k"onnen.
\chapter{Hooks}
Stell dir vor, du sitzt als Softwareentwickler in deinem Büro,
es ist Freitag nachmittag, kurz vor Feierabend, gute 30 Grad Celsius
warm und dein Chef kommt herein und trägt dir auf, das auf der
Firmenwebseite die Zeile ``Über uns'' in Fettschrift
angezeigt werden soll. Also änderst du die Zeile
\begin{verbatim}
echo "Über uns";
\end{verbatim}
um in
\begin{verbatim}
echo "<h2>Über uns</h2>"
\end{verbatim}
in der Datei ``header.php''.\\
Du lädst die Seite in das Git-Repo, lädst die geänderte Datei auf
das Produktivsystem, fährst deinen Rechner runter und gehst in
den Feierabend.\\
\\
Montag morgen kommst du in die Firma und darfst erst einmal zum Chef
kommen, der dir erzählt, dass statt der Firmenwebseite das ganze
Wochenende nur eine weisse Seite zu sehen war. Das demonstriert er dir
eindeutig auf seinem Laptop. Deine Gesichtsfarbe wechselt von
sommerlich gebräunt zum Rot eines Herbstapfels, hin zu einem weiss,
wogegen die Wandfarbe eines bekannten Farbherstellers grau wirkt!\\
\\
Was war passiert?\\
\\
Ganz einfach: Ungetestet wurde eine fehlerhafte PHP-Datei auf den Server
kopiert und aufgrund des fehlenden Semikolons am Ende der Befehlszeile,
wurde das Skript von PHP beendet. Hättest du also besser vorher
ein ``php -l header.php'' ausgeführt, um das Skript syntaktisch
überprüfen zu lassen.\\
Damit du Depp also beim nächsten Mal nicht wieder wie ein Vollidiot
zum Chef musst, solltest du dir einfache Tests automatisieren, denn
dafür hast du ja einen Computer.\\
\\
Der Trick: Hooks! In diesem Falle hilft ein sog. ``client hook''.
\section{Client hooks}
So genannte ``client hooks'' sind kleine Programme, die lokal
auf deinem Arbeitsrechner laufen und die sich in den Ablaufprozess
von git einklinken (deshalb auch ``hook'').
\chapter{Ein paar kleinere Tricks}
\section{Wenn es schnell gehen muss}
Es gibt durchaus Situationen, in denen man alle Branches in einem Rutsch
auf den git-Server pushen will, dann verwende man ``git push --all origin''.
Für Tags gilt analog ``git push --tags origin''.
\section{Repository von einem Server zu einem anderen umziehen}
Manchmal ändert sich der Name des Servers, auf dem die Repos gepackt
werden, z.B. wenn der Name des Unternehmens sich ändert, oder wenn
man von GitHub zu einem eigenen git-Server migriert. Gründe gibt
es genug.
Jedenfalls muss man erst einmal dafür Sorge tragen, dass das Repo auf
dem alten Server vollständig ist und keiner im Team mehr dorthin
einen Push durchführt. Ausserdem muss das eigene Repo ebenfalls komplett
auf dem aktuellsten Stand sein. Der Umzug geht dann ganz unspektakulär
per ``git git remote set-url origin <neue URL>'' von sich. Ein aktuelles
Beispiel für dieses Repo:
\begin{verbatim}
git remote set-url origin opengit@opengit.hauke-zuehl.de: \
hauke/Git-Einfuehrung.git
\end{verbatim}
\section{Zweige miteinander vergleichen}
``git diff'' in einem Zweig anzuwenden, um Unterschiede anzeigen zu
lassen, ist für Dich ein Kiderspiel, aber nehmen wir mal an, du bist
im Zweig ``develop'' und willst die Änderungen gegenüber den Masterzweig
wissen. Dann gibst du einfach mal ``git diff master'' ein.
Das geht natürlich mit jedem anderen Zweig dieses Repositories, den du
einmal ausgecheckt (und nicht gelöscht) hast.
\chapter{GIT in IDEs}
Die meisten IDEs bringen inzwischen Unterst"utzung f"ur GIT mit.\\

11
README.md

@ -3,3 +3,14 @@
Eine einfache Einführung, simpel erklärt, in das Versionskontrollsystem
GIT.
## Dokumentation selbst erstellen
Du kannst die Dokumentation selbst per Hand erstellen.
Dazu benötigst du die Pakete "texlive-extra-utils" und "texlive-lang-german".
Dann kannst du mit Hilfe von "pdflatex Git.tex" eine PDF-Datei
erstellen.
Hinweis:
Um das Inhaltsverzeichnis zu erstellen, musst du pdflatex zwei Mal
durchlaufen lassen!

Loading…
Cancel
Save