Arbeitsverzeichnis, Index und Objektspeicher (GIT)

Aus Siduction Wiki DE
Wechseln zu: Navigation, Suche

GIT-Tutorial: Übersicht

Vorbemerkung

In diesem Kapitel geht es um GIT-Interna, die am Anfang nicht so wichtig sind, für fortgeschrittenes Verständnis aber hilfreich sind.

Ein Repository besteht aus drei Schichten:

  • Das Arbeitsverzeichnis: Dort befinden sich die Dateien nach dem Auschecken.
  • Der Index: Hier wird gesammelt, was zum nächsten Commit ansteht.
  • Der Objektspeicher: Die Datenbank, die Objekte folgender Typen enthält:
    • Blobs: Dahinter verbergen sich die Datei- und andere Inhalte
    • Trees: Diese beinhalten die Zuordnung zwischen Datei/Pfadnamen und Blobs.

GIT-Kommandos und Ebenen

4-ebenen-transport 600.png

Arbeitsverzeichnis

Das Arbeitsverzeichnis stellt den Bereich dar, in dem der Benutzer mit den Dateien des Repository arbeitet, d.h. anschaut und verändert. Zum Arbeitsverzeichnis gehören alle Dateien und Unterverzeichnisse des Repositories außer .git.

Folgende Kommanos beeinflussen das Arbeitsverzeichnis:

  • git checkout <branch>: Es werden alle Dateien auf den Stand des genannten Branches gebracht
  • git reset --hard ...: Ein oder mehrere Dateien werden auf einen genannten Stand gebracht, evt. Änderungen verworfen.

Index

Grobe Vereinfachung für Normalanwender: Im Index merkt sich GIT, was zum Commit ansteht.

Wichtig: Es werden hier keine Inhalte gespeichert!

Für den Normalanwender ist die Existenz des Index nur soweit wichtig, dass er nicht vergisst, vor dem Commit den Index zu aktualisieren (mittels "git add" oder der Option -a bei "git commit -a".

Hintergrund

Der Index erlaubt mehr Überblick: Einige Kommandos sehen nur die Dateien im Index, andere nur die Dateien, die nicht im Index stehen. Es werden also Dateien, die "fertig zum Commit" sind, aus dem Blickfeld genommen, was den Überblich erleichtert.

Kommandos

  • git add
  • git commit -a
  • git reset --middle
  • git reset --hard

Technisches

Der Index ist in der Datei .git/index gespeichert und ist ein Binärfile.

  • enthält je Datei alle Informationen, die für das Erzeugen eines Tree-Objekts notwendig sind
  • erlaubt einen schnellen Vergleich von Tree-Objekt und Datei im Arbeitsverzeichnis
    • je Datei werden zusätzliche Daten wie Änderungszeitpunkt (zum Zeitpunkt des letzten Commits) gespeichert

Einen vollen Einblick in den Index gewährt:

git ls-files --staged --debug -v
100644 a61fe5c2b622c0c16a28a827e39aedb37351d321 0       .gitignore
  ctime: 1317573915:162631036
  mtime: 1317573915:162631036
  dev: 2065     ino: 274749
  uid: 1000     gid: 1000
  size: 110     flags: a
...

Objektspeicher

Der Objektspeicher ("object store") werden die eigentlichen Historieninformationen gespeichert. Dabei wird ein "Inhalt" in einem Blob (das ist eine Datei) mit dem Namen des SHA1-Hashcodes als Pfad/Dateiname gespeichert.

Beispiel:

 mkdir /tmp/test ; chdir /tmp/test
 git init
 echo abc >demo.txt
 git add demo.txt
 git commit -m "Demo-Datei" demo.txt
 find .git/objects/ -type f
.git/objects/b4/40a9307b57cd8904f70c8f4cf2419cbb84aebc
.git/objects/8b/aef1b4abc478178b004d62031cf7fe6db6f903
.git/objects/fd/71bb194690c2ccc1100c03f93be038c62d3189

Es wurden im Objektspeicher drei Objekte abgelegt. Dabei ist zu beachten, dass die ersten 2 Hexziffern des SHA1-Hashcode im Verzeichnisnamen stecken, der Rest im Dateinamen.

Git bietet die Möglichkeit, den Inhalt zu einem Hashcode zu ermitteln. Hinweis: Der Hashcode kann soweit abgekürzt werden, solange er noch eindeutig ist und mindestens 4 Zeichen enthält.

 git cat-file -p b440
100644 blob 8baef1b4abc478178b004d62031cf7fe6db6f903    demo.txt
 git cat-file -p 8bae
abc
 git cat-file -p fd7
tree b440a9307b57cd8904f70c8f4cf2419cbb84aebc
author hamatoma <hamatoma@gmx.de> 1314516801 +0200
committer hamatoma <hamatoma@gmx.de> 1314516801 +0200

Demo-Datei

Die drei Objekte sind das Tree-Objekt (mit dem Dateinamen "demo.txt"), der Inhalt der Datei "abc" und der Commit-Eintrag "tree...".

Im Commit-Eintrag wird das Tree-Objekt, referenziert: b440a9307b57cd8904f70c8f4cf2419cbb84aebc. Dass das Tree-Objekt mehr enthält als den Dateinamen, zeigt ein Hexdump:

 hd git/objects/b4/40a9307b57cd8904f70c8f4cf2419cbb84aebc
00000000  78 01 2b 29 4a 4d 55 30  36 63 30 34 30 30 33 31  |x.+)JMU06c040031|
00000010  51 48 49 cd cd d7 2b a9  28 61 e8 5e f7 71 cb ea  |QHI...+.(a.^.q..|
00000020  23 15 e2 dd 0c be 49 cc  32 df ff e5 6e fb c9 0c  |#.....I.2...n...|
00000030  00 4a 64 11 05                                    |.Jd..|