Hin und wieder gibt es Situationen, die mit den gängigen Git-Clients für MacOS oder Windows ohne weiteres nicht gemanagt werden können. Hier lohnt sich der Weg über die Kommandozeile auf der Shell, um schnell zum Ziel zu kommen.
Das Arbeiten mit dem dezentralen Versionsverwaltungs-Tool Git ist optimal, um den Code-Stand von Web-Projekten mit mehreren Entwicklern auszutauschen und in der Webentwicklung gemeinsam Projekte an den Start zu bringen.
Es gibt Fälle, in denen man ein Remote-Repository temporär oder dauerhaft auf seiner Festplatte oder einem Backupserver ablegen bzw. archivieren möchte. Klar, du könntest das Repo auf klassischem Wege klonen – dann hast du aber alle Dateien des „working directories“ einzeln ausgecheckt, was du aus verschiedenen Gründen vielleicht nicht möchtest.
Mit dem folgenden Kommando kannst du auf der Shell ein Repo als „Bare Repo“ vom Remote-Repository laden, ohne dass du den „working tree“ lokal abbilden musst:
git clone --bare <Deine-Remote-Repo-URL>.git
Nun hast du in dem Verzeichnis, von dem du in der in der Shell gearbeitet hast, das gesamte Repository in einem Ordner vorliegen.
Die Ordner-Struktur innerhalb dieses Bare-Repo-Ordners ist anders, als wenn du dein Repo zum Editieren von einzelnen Dateien auscheckst. Dadurch, dass du das Repo als Bare-Repo geklont hast, läufst du z.B. keine Gefahr, dass du mit einzelnen Dateien Konflikte herbeiführst. Denn du hast so keine Dateien in einzelnen Branches ausgecheckt, sondern das Repo liegt jetzt „als Ganzes“ vor.
Den Ordner, der das Bare-Repo enthält, kannst du nun archivieren.
Um das Bare-Repo zu einem späteren Zeitpunkt wieder bei deinem Git-Hoster ins Remote zu laden, rufe einfach die folgenden Kommandos auf:
cd <Repo-Name>.git
git push --mirror <Deine-Remote-Repo-URL>.git
Manchmal passiert es, dass man unbewusst oder aus Unachtsamkeit große Dateien ins Repository eingecheckt hat. Das Ergebnis: Die Größe des Repos wächst an. Deine Kollegen werden sich bedanken, wenn sie das Repo lokal klonen müssen und erstmal gigabyteweise Daten aus dem Remote-Repository geladen werden müssen.
Mit den folgenden Kommandos kannst du auf deiner Shell diese großen Dateien rückwirkend aus allen Commits/Revisionen entfernen und somit die Größe des Repositories wieder verkleinern:
git filter-branch --force --index-filter 'git rm --cached \
--ignore-unmatch <pfad/zur/großen/Datei>' --prune-empty \
--tag-name-filter cat -- --all
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive --prune=now
git push --all –force
Beispiel: Datei “video.iso” aus Repo entfernen
git filter-branch --force --index-filter 'git rm --cached \
--ignore-unmatch uploads/videos/video.iso' --prune-empty \
--tag-name-filter cat -- --all
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive --prune=now
git push --all –force
Du musst wissen, welche Dateien explizit für die Größe verantwortlich sind und aus deinem Repository entfernt werden sollen, da du diese im ersten Kommando angeben musst.
Aber Achtung: Diese Methode ist eine Art „Holzhammer-Methode“, die du auf das Repo ausführst!
Die Option „–force“ beim letzten Push-Vorgang überschreibt faktisch alles im Repo. Du solltest diesen Vorgang daher vorab mit deinen Team-Kollegen absprechen, um keine ungewollten Änderungsverluste zu produzieren.
Ein guter Ansatz, um von vornherein bestimmte Dateien erst gar nicht in dein Repo zu laden, ist die Anlage einer guten .gitignore-Datei.
Wenn du wissen willst, in welchen Commits eine bestimmte Datei geändert wurde, kannst du mit dem folgenden Kommando auf der Shell suchen:
git log --all --source --name-only --pretty=medium -- '<Suchmuster>'
Beispiel 1: Alle Commits anzeigen, in denen eine PDF-Datei geändert wurde
git log --all --source --name-only --pretty=medium -- '*.pdf'
Beispiel 2: Alle Commits anzeigen, in denen die Datei styles.css in einem bestimmten Ordern verändert wurde
git log --all --source --name-only --pretty=medium -- 'assets/css/styles.css'
In der Ausgabe erhältst du dann alle relevanten Commits mit Datum, Commit-Message und weiteren Details aufgelistet.
In Tipp 3 hast du gesehen, wie du nach Commits zu bestimmten Datei-Änderungen suchen kannst. Schneller ist aber manchmal, einfach nur DENJENIGEN Commit anzuzeigen, in dem eine Datei das letzte Mal bearbeitet wurde.
Dies erledigst du ganz einfach mit dem folgenden Kommando auf der Shell:
git rev-list --graph --pretty=medium -n 1 HEAD -- <pfad/zur/datei/mit/dateinamen>
Beispiel: Den letzten Commit anzeigen, in dem die styles.css zuletzt geändert wurde:
git rev-list --graph --pretty=medium -n 1 HEAD -- assets/css/styles.css
In der Ausgabe erhältst du den Commit-Hash sowie weitere Informationen zum Datum, Author und Commit-Message von der letzten Änderung an dieser Datei.
Wenn du vor dem Mergen zweier Branches wissen willst, welche Commits aus Branch 1 noch nicht in Branch 2 gemergt sind, kannst du mit dem folgenden Kommando auf der Shell eine Liste der Commits erzeugen:
git log --left-right --oneline --pretty=medium '<Branch1>'...'<Branch2>'
Beispiel: Welche Commits im Branch staging sind noch nicht auf production gemergt?
git log --left-right --oneline --pretty=medium 'staging'...'production'
In der Ausgabe erhältst du eine Liste von Commits, die in Branch 2 noch nicht enthalten sind.
Weitere, vollumfängliche Informationen zu Git und all seinen mächtigen Funktionen findest du auf der offiziellen Website unter https://git-scm.com/docs/.
Schreibe einen Kommentar