Git: Attributes, Ignore und LFS

4 Minuten zum Lesen
Git: Attributes, Ignore und LFS
Mit .gitattributes und .gitignore steuerst du, was ins Repository kommt und wie Dateien behandelt werden. Für große Dateien lohnt sich Git LFS, aber nur mit sauberer Konfiguration und klarer Kommunikation im Team.

Wenn mehrere Personen an einem Repository arbeiten, wird Git schnell zur zentralen Schnittstelle. Damit das gut funktioniert, braucht es mehr als nur Commit-Messages und Branches. In diesem Artikel werfen wir einen Blick auf zwei wichtige Konfigurationsdateien im Git-Workflow: .gitignore und .gitattributes. Beide sorgen dafür, dass Dateien korrekt behandelt werden und die Zusammenarbeit im Team reibungslos läuft. Außerdem schauen wir uns Git LFS an, das beim Umgang mit großen Dateien hilft.

Dateien ignorieren mit .gitignore

.gitignore ist vermutlich die bekannteste Git-Konfigurationsdatei. Sie sorgt dafür, dass bestimmte Dateien wie Logs, temporäre Daten oder generierte Binaries nicht ins Repository gelangen. Das verhindert unnötigen Ballast und sorgt für eine saubere Codebasis. Jeder Eintrag in dieser Datei ist ein Filter für dein Git-Tracking.

# build output
dist/

# generated types
.astro/

# dependencies
node_modules/

Die Datei muss nicht jeder selbst definieren. Hier kann auf Vorlagen zurückgegriffen werden. GitHub stellt z.B. für unterschiedliche Programmiersprachen und Frameworks eine Sammlung an .gitignore-Vorlagen zur Verfügung. Hier kann auch eine Kombination aus mehreren Vorlagen sinnvoll sein.

Dateibehandlung mit .gitattributes

.gitattributes ist weniger bekannt, aber sehr mächtig. Hier kannst du z. B. definieren, wie Zeilenumbrüche behandelt werden sollen. Das ist besonders relevant bei plattformübergreifender Entwicklung. Windows nutzt CRLF (\r\n), Unix-Systeme setzen auf LF (\n). Git wandelt beim Auschecken die Endungen so um, dass sie zur lokalen Umgebung passen, speichert im Index aber das definierte Format. So funktionieren etwa Shell-Skripte, die unter Linux laufen sollen, auch zuverlässig, wenn sie auf einem Windows-System entwickelt wurden.

# Scripts
*.bash     text eol=lf
*.fish     text eol=lf
*.sh       text eol=lf
# These are explicitly windows files and should use crlf
*.bat      text eol=crlf
*.cmd      text eol=crlf
*.ps1      text eol=crlf

# Archives
*.7z       filter=lfs diff=lfs merge=lfs -binary
*.gz       filter=lfs diff=lfs merge=lfs -binary
*.tar      filter=lfs diff=lfs merge=lfs -binary
*.tgz      filter=lfs diff=lfs merge=lfs -binary
*.zip      filter=lfs diff=lfs merge=lfs -binary

Auch hier gibt es auf GitHub eine Sammlung an Vorlagen, die du nutzen kannst. Diese sind in der Regel für die gängigsten Programmiersprachen und Frameworks optimiert. Du kannst sie aber auch anpassen, um sie an deine speziellen Bedürfnisse anzupassen. Wie bei .gitignore kann auch hier eine Kombination aus mehreren Vorlagen sinnvoll sein.

Binary oder Text?

Mit .gitattributes kannst du auch festlegen, ob eine Datei als Text oder als Binary behandelt werden soll. Das beeinflusst, ob Git sinnvoll Diffs anzeigen kann. Für Binärdateien ergibt das keinen Sinn, daher sollte man sie entsprechend markieren. So vermeidet man unschöne Merge-Konflikte oder fehlerhafte Darstellungen im Diff.

# Graphics
*.png      binary
*.jpg      binary
*.jpeg     binary
*.gif      binary
*.tif      binary
*.tiff     binary
*.ico      binary

Spezielle Merge-Strategien

Für bestimmte Dateien lassen sich eigene Merge-Strategien definieren. Beispielsweise kann man festlegen, dass bei Bilddateien immer die lokale Version bevorzugt wird. Das kann praktisch sein, muss aber mit Bedacht eingesetzt werden. Falsch konfiguriert führt es schnell zu unerwünschtem Verhalten.

Große Dateien auslagern mit Git LFS

Git LFS (Large File Storage) hilft bei der Verwaltung großer Dateien, indem diese nicht direkt im Repository gespeichert werden. Stattdessen werden nur Verweise abgelegt. So bleibt das Repository schlank, besonders bei häufigen Änderungen. Konfiguriert wird LFS ebenfalls über .gitattributes. Wichtig ist, dass alle im Team die Extension installiert haben. Tools wie Husky können beim Commit prüfen, ob LFS aktiv ist. Wenn nicht, wird der Commit abgelehnt. Das sorgt dafür, dass alle Teammitglieder die gleichen Standards einhalten und keine großen Dateien ins Repository gelangen. Mehr zu Husky in einem späteren Artikel.

Zusätzlich kann auf Serverseite, z. B. in Azure DevOps, das Pushen großer Dateien direkt verhindert werden. So kann das Problem lokal behoben, bevor es an alle Entwickler weitergegeben wird.

Azure DevOps: Repository Policies

Globale Git-Konfiguration

Neben repositoryspezifischen Einstellungen gibt es auch globale Konfigurationsmöglichkeiten. So lässt sich das Verhalten von Zeilenumbrüchen auch auf Nutzerebene steuern. Zusätzlich kannst du globale .gitignore- und .gitattributes-Dateien einrichten. Das ist hilfreich, wenn du unternehmensweit einheitliche Standards setzen willst. Trotzdem lohnt es sich, bei neuen Repositories direkt mit einer guten Grundkonfiguration zu starten. So können neue Teammitglieder direkt sehen, wie das Repository konfiguriert ist und welche Standards gelten.

git config --global core.autocrlf true # Makes sure that line endings are converted to CRLF on checkout and LF on commit
git config --global core.attributesfile ~/.gitattributes # Sets the global attributes file to the user's home directory
git config --global core.excludesfile ~/.gitignore # Sets the global ignore file to the user's home directory

Ein Beispiel kannst du dem Open Space Planner (.gitattributes, .gitignore) entnehmen.

Hast du .gitattributes und Git LFS schon im Einsatz oder gab es bei dir mal Probleme damit? Schau gerne bei uns auf LinkedIn vorbei und diskutiere mit.

Florian Bader

Florian Bader

Florian ist Solution Architect und Microsoft Most Valuable Professional für Azure IoT mit langjähriger Erfahrung im Bereich DevOps, Cloud und Digitalisierung. Er unterstützt Unternehmen dabei, effiziente und effektive Lösungen zu entwickeln, die ihre digitalen Projekte nachhaltig zum Erfolg führen.

Verwandte Beiträge

Entdecken Sie weitere Artikel, die ähnliche Themen behandeln und vertiefen Sie Ihr Wissen. Diese Beiträge wurden basierend auf gemeinsamen Tags und Veröffentlichungsdaten ausgewählt. Viel Spaß beim Weiterlesen!