git needs no credentials and takes
no config: it is a program tree with nothing to authenticate to, so
installing it is one line.
Install
clis: section; see the
CLI overview.
The repository is read through the mount
-C names a directory inside a mount, and everything under it is read
with the same ops any command uses. The repository is never opened from
the host filesystem, so a repository on a RAM mount, a disk mount or an
object store all read the same way, and packfiles, loose objects and the
index are all read through the mount.
-C defaults to the working directory, and the repository is found by
walking up from there, so a path inside the tree works:
Verbs
Inspect
log and show take --pretty/--format with git’s grammar: the
oneline, short, medium, full and fuller presets, plus
format:/tformat: placeholder strings (a bare % string is
tformat:). Placeholders cover ids (%H %h %T %t %P %p), author and
committer fields (%an %ae %ad %at %cn %ce %cd %ct), the message
(%s %b %B), decorations (%d %D), and %n %% %xHH; an unknown
placeholder stays verbatim, exactly as git prints it. log --all walks
every ref, tags peeled. show takes --stat (git’s scaled diffstat
table), --name-only, and -s/--no-patch, which suppresses every
diff section just as it does in git.
status honors .gitignore at every level, including negated rules, and
collapses an untracked directory to one entry the way git does (-uall
descends, -uno hides untracked files entirely).
Change
commit records mirage <mirage@localhost> unless --author says
otherwise: git reads user.name from config files that a mount does not
serve, and inventing a name would put an unreviewed one into history.
Deliberate limits
- No network verbs.
clone,fetch,pullandpushare absent. - No
reset --hard. It destroys uncommitted work with no reflog here to recover it from. resettakes no revision. Real git resets the index to any commit named as an operand; this build resets it from HEAD only and refuses a revision by name rather than doing nothing quietly.checkoutrefuses a staged change rather than merging it into the target, so nothing is silently resolved.- Diff hunk bodies can differ from git’s on the same change. Headers,
mode lines and blob abbreviations match; the line grouping inside a
hunk comes from a different algorithm than git’s xdiff.
show --statline counts come from the same algorithm, so a rewritten hunk can count slightly differently than git counts it. --prettyknows the block presets, not the wire formats.raw,email,mboxrdandreferenceare refused by name (unsupported --pretty format), not silently misrendered.--date=relative formats and--decorateare absent; decorations render only through%d/%D, matching git’s piped default of no decorations.logdates are strict.--since/--untilread ISO-8601 or an epoch second; git’s relative wording (2 weeks ago) is refused rather than misread.