Git-Installation und -Konfiguration#
Installation#
Für iX-Distributionen sollte Git im Standard-Repository vorhanden sein.
$ sudo apt install git-all
Mit der Bash-Autovervollständigung lässt sich Git auf der Kommandozeile einfacher bedienen:
$ sudo apt install bash-completion
Es gibt verschiedene Möglichkeiten, Git auf einem Mac zu installieren. Am
einfachsten ist es vermutlich, die Xcode Command Line Tools zu installieren.
Hierfür müsst ihr nur git
das erste Mal vom Terminal aufrufen:
$ git --version
git-completion
könnt ihr mit Homebrew installieren:
Anschließend müsst ihr folgende Zeile in ~/.bash_profile
hinzufügen:
[[ -r "$(brew --prefix)/etc/profile.d/bash_completion.sh" ]] && . "$(brew --prefix)/etc/profile.d/bash_completion.sh"
Ihr könnt einfach https://git-scm.com/download/win aufrufen und den passenden Download starten.
Siehe auch
Konfiguration#
$ git config --global user.name "[name]"
legt den Namen fest, den mit euren Commit-Transaktionen verknüpft wird.
$ git config --global user.email "[email address]"
legt die E-Mail fest, die mit euren Commit-Transaktionen verknüpft wird.
$ git config --global color.ui auto
aktiviert die Kolorierung der Befehlszeilenausgabe.
Die ~/.gitconfig
-Datei#
Mit den oben angegebenen Befehle kann z.B. folgende Datei erstellt werden:
[user]
name = veit
email = veit@cusy.io
[color]
diff = auto
status = auto
branch = auto
In der ~/.gitconfig
-Datei können jedoch auch Aliase festgelegt werden:
[alias]
st = status
ci = commit
br = branch
co = checkout
df = diff
dfs = diff --staged
Auch der Editor lässt sich angeben und die Hervorhebung von Leerzeichenfehlern
in git diff
:
[core]
editor = vim
# Highlight whitespace errors in git diff:
whitespace = tabwidth=4,tab-in-indent,cr-at-eol,trailing-space
Anmeldedaten verwalten#
Seit der Git-Version 1.7.9 lassen sich die Zugangsdaten zu git-Repositories mit gitcredentials verwalten. Um diese zu nutzen, könnt ihr z.B. folgendes angeben:
$ git config --global credential.helper Cache
Hiermit wird ihr Passwort für 15 Minuten im Cache-Speicher gehalten. Der Timeout kann ggf. erhöht werden, z.B. mit:
$ git config --global credential.helper 'cache --timeout=3600'
macOS#
Unter macOS lässt sich mit osxkeychain die Schlüsselbundverwaltung (Keychain) nutzen um die Zugangsdaten zu speichern. osxkeychain setzt Git in der Version 1.7.10 oder neuer voraus und kann im selben Verzeichnis wie Git installiert werden mit:
$ git credential-osxkeychain
git: 'credential-osxkeychain' is not a git command. See 'git --help'.
$ curl -s -O http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain
$ chmod u+x git-credential-osxkeychain
$ sudo mv git-credential-osxkeychain /usr/bin/
Password:
git config --global credential.helper osxkeychain
Dies trägt folgendes in die ~/.gitconfig ein:
[credential]
helper = osxkeychain
Windows#
Für Windows steht Git Credential Manager for Windows zur Verfügung. Für das Programm muss der Installer heruntergeladen werden. Nach dem Doppelklick führt er Euch durch die weitere Installation. Als Terminal-Emulator für Git Bash solltet ihr das Standardkonsolenfenster von Windows auswählen.
Bemerkung
Ein umfangreiches Beispiel einer Konfigurationsdatei findet ihr in meinem `dotfiles-Repository: .gitconfig.
Die .gitignore
-Datei#
In der .gitignore
-Datei eines Repository könnt ihr Dateien von der
Versionsverwaltung ausschließen. Eine typische .gitignore
-Datei kann z.B. so
aussehen:
/logs/*
!logs/.gitkeep
/tmp
*.swp
Dabei verwendet Git Globbing-Muster, u.a.:
Muster |
Beispiel |
Erläuterung |
---|---|---|
**/logs
|
|
Ihr könnt zwei Sternchen voranstellen um Verzeichnisse an einer beliebigen Stelle im zu finden. |
**/logs/instance.log
|
|
Ihr könnt zwei Sternchen voranstellen um Dateien anhand ihres Namens in einem übergeordneten Verzeichnis zu finden. |
*.log
|
|
Ein Sternchen ist ein Platzhalter für null oder mehr Zeichen. |
/logs
!/logs/.gitkeep
|
|
Ein vor ein Muster gestelltes Anführungszeichen ignoriert dieses. Wenn eine Datei mit einem Muster übereinstimmt, aber auch mit einem negierenden, das später definiert ist, wird sie nicht ignoriert. |
/instance.log
|
|
Mit dem vorangestellten Schrägstrich passt das Muster nur zu Dateien im Stammverzeichnis des Repository. |
instance.log
|
|
Üblicherweise passen die Muster zu Dateien in jedem Verzeichnis. |
instance?.log
|
|
Ein Fragezeichen passt genau zu einem Zeichen. |
instance[0-9].log
|
|
Eckige Klammern können verwendet werden um ein einzelnes Zeichen aus einem bestimmten Bereich zu finden. |
instance[01].log
|
|
Eckige Klammern passen auf ein einzelnes Zeichen aus einer bestimmten Menge. |
instance[!01].log
|
|
Ein Ausrufezeichen kann verwendet werden um ein beliebiges Zeichen aus einer angegebenen Menge zu finden. |
logs
|
|
Wenn kein Schrägstrich anhängt, passt das Muster sowohl auf Dateien als auch auf den Inhalt von Verzeichnissen mit diesem Namen. |
logs/
|
|
Das Anhängen eines Schrägstrichs zeigt an, dass das Muster ein Verzeichnis ist. Der gesamte Inhalt jedes Verzeichnisses im Repository, das diesem Namen entspricht – einschließlich all seiner Dateien und Unterverzeichnisse – wird ignoriert. |
var/**/instance.log
|
|
Zwei Sternchen passen zu null oder mehr Verzeichnissen. |
logs/instance*/error.log
|
|
Wildcards können auch in Verzeichnisnamen verwendet werden. |
logs/instance.log
|
|
Muster, die eine Datei in einem bestimmten Verzeichnis angeben, sind relativ zum Stammverzeichnis des Repository. |
Git-commit leerer Ordner#
In obigem Beispiel seht ihr, dass mit /logs/*
keine Inhalte des
logs
-Verzeichnis mit Git versioniert werden soll, in der Folgezeile jedoch
eine Ausnahme definiert wird: !logs/.gitkeep
erlaubt, dass die Datei
.gitkeep
mit Git verwaltet werden darf. Damit wird dann auch das
logs
-Verzeichnis in das Git-Repository übernommen. Diese Hilfskonstruktion
ist erforderlich, da leere Ordner nicht mit Git verwaltet werden können.
Eine andere Möglichkeit besteht darin, in einem leeren Ordner eine
.gitignore
-Datei mit folgendem Inahlt zu erstellen:
# ignore everything except .gitignore
*
!.gitignore
excludesfile
#
Ih könnt jedoch auch zentral für alle Git-Repositories Dateien ausschließen.
Hierfür wird üblicherweise in der ~/.gitconfig
-Datei folgendes angegeben:
[core]
# Use custom `.gitignore`
excludesfile = ~/.gitignore
…
Bemerkung
Hilfreiche Vorlagen findet ihr in meinem dotfiles-Repository oder auf der Website gitignore.io.
Ignorieren einer Datei aus dem Repository#
Wenn ihr eine Datei ignorieren wollen, die in der Vergangenheit bereits dem Repository hinzugefügt
wurde, müsst ihr die Datei aus eurem Repository löschen und dann eine
.gitignore
-Regel für sie hinzufügen. Die Verwendung der Option --cached
bei git rm
bedeutet, dass die Datei aus dem Repository gelöscht wird, aber als ignorierte Datei in eurem
Arbeitsverzeichnis verbleibt.
$ echo *.log >> .gitignore
$ git rm --cached *.log
rm 'instance.log'
$ git commit -m "Remove log files"
Bemerkung
Ihr könnt die Option --cached
weglassen, wenn ihr die Datei sowohl aus dem Repository als
auch aus Ihrem lokalen Dateisystem löschen wollt.
Commit einer ignorierten Datei#
Es ist möglich, den Commit einer ignorierten Datei an das Repository mit der Option -f
(oder
--force
) bei git add
zu erzwingen:
$ cat data/.gitignore
*
$ git add -f data/iris.csv
$ git commit -m "Force add iris.csv"
Ihr könnt dies in Erwägung ziehen, wenn ihr ein allgemeines Muster (wie *
) definiert habt, aber
eine bestimmte Datei übertragen wollt. Eine bessere Lösung ist meist jedoch, eine Ausnahme von
der allgemeinen Regel zu definieren:
$ echo '!iris.csv' >> data/.gitignore
$ cat data/.gitignore
*
!iris.csv
$ git add data/iris.csv
$ git commit -m "Add iris.csv"
Dieser Ansatz dürfte für euer Team offensichtlicher und weniger verwirrend sein.
Fehlersuche in .gitignore
-Dateien#
Bei komplizierten .gitignore
-Mustern oder bei Mustern, die über mehrere .gitignore
-Dateien
verteilt sind, kann es schwierig sein, herauszufinden, warum eine bestimmte Datei ignoriert wird.
Ihr könnt den Befehl git check-ignore
mit der Option -v
(oder --verbose
) verwenden, um
festzustellen, welches Muster die Ursache für das Ignorieren einer bestimmten Datei ist:
$ git check-ignore -v data/iris.csv
data/.gitignore:2:!iris.csv data/iris.csv
Die Ausgabe zeigt FILE_CONTAINING_THE_PATTERN:LINE_NUMBER_OF_THE_PATTERN:PATTERN
FILE_NAME
Ihr könnt mehrere Dateinamen an git check-ignore
übergeben, wenn ihr möchtet, und die Namen
selbst müssen nicht einmal den Dateien entsprechen, die in eurem Repository existieren.