Einführung
Git ist in zwei Schichten aufgeteilt. Plumbing-Befehle sind Low-Level-Bausteine, die auf der Objektdatenbank, Refs und dem Index operieren. Porcelain-Befehle sind nutzerfreundliche Wrapper, aus Plumbing aufgebaut. git commit ist Porcelain; git hash-object, git write-tree und git update-ref sind Plumbing.
Warum die Aufteilung
Porcelain-Ausgabe ist für Menschen und kann sich zwischen Versionen ändern. Plumbing-Ausgabe ist stabil, parsbar und für Skripte gedacht. Sie zu verwechseln ist die häufigste Ursache zerbrechlicher Git-Skripte.
Häufige Porcelain-Befehle
git add,git commit,git status,git loggit switch,git restore,git branchgit merge,git rebase,git cherry-pickgit fetch,git pull,git push,git clone
Häufige Plumbing-Befehle
git hash-object: berechnet den SHA von Inhalt, optional mit Schreiben.git cat-file: liest Typ, Größe oder Inhalt eines Objekts.git ls-tree,git ls-files: listet Tree- oder Index-Inhalte auf.git rev-parse: löst einen Namen zu einem SHA auf.git rev-list: listet Commit-SHAs aus einer Graph-Traversierung auf.git update-ref,git symbolic-ref: Ref-Manipulation.git read-tree,git write-tree,git commit-tree: Index/Tree/Commit-Erstellung.git update-index: Low-Level-Index-Manipulation.git pack-objects,git unpack-objects,git index-pack.
Einen Commit von Hand bauen
Um Plumbing in Aktion zu sehen, bauen Sie einen Commit ohne Porcelain:
BLOB=$(echo "hello" | git hash-object --stdin -w)
TREE=$(printf "100644 blob $BLOB\thello.txt\n" | git mktree)
COMMIT=$(echo "first" | git commit-tree $TREE)
git update-ref refs/heads/main $COMMIT
git log --oneline
Das ist im Wesentlichen das, was git commit intern tut.
Stabile Skript-Schnittstellen
Manche Porcelain-Befehle haben einen "Porcelain"-Modus mit einem stabilen, parsbaren Format:
git status --porcelain=v2
git diff --raw
git ls-files --stage
git for-each-ref --format='%(refname) %(objectname)'
Verwenden Sie diese in Skripten; parsen Sie niemals die menschliche Ausgabe von git status.
Die Manpage lesen
Porcelain-Manpages sind in git help -a unter "Main Porcelain Commands" aufgeführt; Plumbing unter "Manipulators", "Interrogators", "Synching repositories", "Internal helpers". Für Internas-Tutorials laufen Sie git help gitcore-tutorial und git help gitrepository-layout.
Wann Plumbing verwenden
- Verlässliche Skripte schreiben, die Git-Upgrades überleben.
- Tooling bauen, das in Gits Datenmodell integriert.
- Porcelain-Befehle debuggen, indem ihre internen Schritte reproduziert werden.
- Eigene Workflows implementieren, in die Porcelain nicht passt.
Häufige Fehler
Die menschliche Ausgabe von git status oder git log in Skripten parsen und an einem Git-Upgrade oder Locale-Wechsel zerbrechen. Verwenden Sie --porcelain-Formate und --pretty=format: mit expliziten Platzhaltern. git update-ref ohne die Drei-Argumente-Compare-and-Set-Form in nebenläufigen Skripten aufrufen und mit einem anderen Prozess kollidieren. Low-Level-git update-index mit High-Level-git add im selben Workflow mischen und mit überraschendem Index-Zustand enden. Schließlich: Annehmen, Porcelain sei immer "sicherer" als Plumbing; manche Plumbing-Operationen (wie git update-ref) sind weit deterministischer als ihre Porcelain-Pendants. Das richtige Werkzeug hängt davon ab, was Sie bauen.