Ausnahmen

Ausnahmen für Versionierung

Es kommt oft vor, das in dem Ordner nicht nur Dateien liegen, die versioniert werden sollen, sondern auch andere (eventuell temporäre) Dateien. Bei der Software-Entwicklung sind es zum Beispiel die kompilierten Binärdateien, oder auch sehr viele temporäre. Auch Office hinterlegt oft temporäre Dateien, wenn man das Original bearbeitet.

Legen wir eine temporäre Datei an, die wir nicht in der Versionsverwaltung haben wollen, zum Beispiel mit dem Namen kapitel_1.~ und kapitel_1.bak.

# Linux / macOS
repo_1$ touch kapitel_1.~ kapitel_1.bak
repo_1$ ls
kapitel_1.bak  kapitel_1.txt  kapitel_1.~
# Windows
PS repo_1> New-Item -ItemType File -Path "kapitel_1.~", "kapitel_1.bak"

    Directory: C:\Users\kurs\src\repo_1

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          28.10.2021    08:50              0 kapitel_1.~
-a---          28.10.2021    08:50              0 kapitel_1.bak

Wenn wir jetzt git status aufrufen, sehen wir zwei noch nicht versionierte Dateien. Das wollen wir eigentlich nicht sehen, da diese Dateien uns nicht interessieren.

repo_1$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        kapitel_1.bak
        kapitel_1.~

nothing added to commit but untracked files present (use "git add" to track)

Globale Ausnahmen (Betriebssystem)

Git bietet für solche Dateien zwei Orte, in denen die Ausnahmen definiert werden können. Wir können die Ausnahmen global (auf Benutzerebene) definieren, oder pro Repository.

Um eine neue Ausnahmedatei für den Benutzer anzulegen, geben Sie Folgendes ein:

# Linux / macOS
repo_1$ git config --global core.excludesfile ~/.gitignore_global
repo_1$ touch ~/.gitignore_global
# Winfows
PS repo_1> git config --global core.excludesfile "$env:USERPROFILE\.gitignore_global"
PS repo_1> New-Item "$env:USERPROFILE\.gitignore_global"

    Directory: C:\Users\kurs

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          11.11.2021    19:47              0 .gitignore_global

Nun kann in die betreffende Datei .gitignore_global1 die Liste der globalen Ausnahmen gepflegt werden. Fügen Sie in unserem Fall einfach Folgendes als erste Zeilen in die Datei ein:

# Ignore global backup files
*.bak

Die Zeilen, die mit # Anfangen, werden als Kommentare ausgewertet.

Eine sehr gute Übersicht über übliche Ausnahmen liefert die Seite github.com/github/gitignore. Im Verzeichnis Global sind dabei die globalen Ausnahmen für unterschiedliche Betriebssysteme (z.B. bei macOS ist es üblich die Datei .DS_Store auszufiltern, oder unter Windows Thumbs.db).

Pro Zeile in der Datei wird eine Ausnahme definiert, die auch Globings (Platzhalter) erlaubt.

  • *: Beliebiges Zeichen, beliebige Anzahl
  • **: Beliebige Unterverzeichnisse
  • ?: Ein Zeichen
  • [Aa]: Regex für kleines/großes A
  • !abc: Mit ! kann die Ausnahme umgekehrt werden (zum Beispiel alles im Ordner XYZ nicht versionieren, aber die Datei abc.md)

Nach dem Hinzufügen der oberen Ausnahme können wir wieder mit git status unsere Bemühungen überprüfen.

repo_1$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        kapitel_1.~

nothing added to commit but untracked files present (use "git add" to track)

Nun wir die Datei kapitel_1.bak nicht mehr angezeigt.

Ausnahmen im Repository

Die Ausnahmen für ein konkretes Repository werden in der Datei .gitignore2 definiert. Meistens wird diese Datei in die Versionsverwaltung aufgenommen, da diese Ausnahmen das konkrete Projekt betreffen und für alle Beteiligten relevant sind.

Die Datei .gitignore gilt dabei für das aktuelle Verzeichnis und alle Unterverzeichnisse. Unterverzeichnisse können dabei eigene Ausnahmen in eigenen .gitignore Dateien definieren, die die Ausnahmen aus den übergeordneten Verzeichnissen ergänzen.

Legen Sie nun die .gitignore Datei im Wurzelverzeichnis von unserem Repository.

# Linux / macOS
repo_1$ touch .gitignore
# Windows
PS repo_1> New-Item .gitignore

    Directory: C:\Users\kurs\src\repo_1

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          11.11.2021    19:53              0 .gitignore

Fügen Sie in die neue Ausnahmedatei folgende Zeilen, um unsere .~ Datei von der Versionsverwaltung auszuschließen.

# Exclude temporal files
*.~

Mit git status sehen wir nun, dass auch die .~ Datei in der Auflistung nicht mehr auftaucht, dafür aber unsere neue .gitignore Ausnahmedatei. Diese sollen wir versionieren.

repo_1$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore

nothing added to commit but untracked files present (use "git add" to track)
repo_1$ git add .gitignore
repo_1$ git commit -m "Add repo ignore file for temp files"
[main c3b4e8b] Add repo ignore file for temp files
 1 file changed, 1 insertion(+)
 create mode 100644 .gitignore

Auf der bereits erwähnten GitHub Seite finden Sie eine Sammlung von Ausnahmedateien für unterschiedliche Projekte (Programmiersprachen / Tools). Sie müssen damit die Ausnahmelisten nicht selbst erstellen, sondern von dieser Seite die vorhandenen als Ausgangsbasis für eigene Projekte nutzen.

docs