Live data from Hacker News

Mounting Git commits as folders with NFS

jvns.ca

1–10 of 95 posts

Re: Mounting Git commits as folders with NFS

#3

Very nice! I really like the design choices here. Though I (edit: am biased and) would personally have used Rust and https://github.com/xetdata/nfsserve .

I've built something like this as well, but in FUSE for Linux, not via NFS.

It really brings home how close git's design already is to being a file system.

Re: Mounting Git commits as folders with NFS

#5
> Git repositories sometimes have submodules. I don’t understand anything about submodules so right now I’m just ignoring them.

Submodules are interesting, because they’re next to unusable from a user perspective (they’re a pain to maintain and interact with unless you never ever update them) but they’re ridiculously simple technically which I assume is what made them attractive.

A submodule is an entry in “.gitmodules” mapping a path to a repository URL (and branch), then at the specified path in the repository is a tree entry of mode 160000 (S_IFDIR + S_IFLNK), whose oid is the commit to check out (in the submodule-linked repository).

Re: Mounting Git commits as folders with NFS

#6
For those who resonate with "why might this be useful", here are "plain git" alternatives to this tool:

> searching for a function I deleted

    git log -G someFunc
> quickly looking at a file on another branch to copy a line from it

I use `git worktree` to "mount" long-running branches much to the same effect as Julias tool. To quickly look at a file from a non-mounted branch/commit, I use:

    git show $REF:$FILENAME
> searching every branch for a function

    git log --all -G someFunc
Note that -G can be replaced with -F for a speedup if the pattern you are searching for is a fixed string.

Re: Mounting Git commits as folders with NFS

#7
post #6

For those who resonate with "why might this be useful", here are "plain git" alternatives to this tool: > searching for a function I deleted git log -G someFunc > quickly looking at a file on another branch to copy a line from it I use `git worktree` to "mount" long-running branches much to the same effect as Julias tool. To quickly look at a file from a non-mounted branch/commit, I use: git show $REF:$FILENAME > sea…

Extremely handy, saving these. Thank you.

Re: Mounting Git commits as folders with NFS

#9
post #5

> Git repositories sometimes have submodules. I don’t understand anything about submodules so right now I’m just ignoring them. Submodules are interesting, because they’re next to unusable from a user perspective (they’re a pain to maintain and interact with unless you never ever update them) but they’re ridiculously simple technically which I assume is what made them attractive. A submodule is an entry in “.gitmodul…

To add to this, Submodules are a hack on Git's data model.

Git's data model, put simply, is this:

* Branches are pointers to Commit objects

* Commit objects are a composite of {Commit_Comment, Tree, Parent Commit(s)}, referenced by the hash of that set

* a Tree (like a directory) is a list of Blobs and/or Trees (associating filenames with them) referenced by the hash of its contents.

* a Blob is a file, referenced by the hash of its contents.

So the set of types of objects in Git are: Commits, Trees, and Blobs.

Note that I said that a Tree can contain other Trees or Blobs... but what if... you put a Commit in it!?

That's a submodule!

Now if the Commit you reference doesn't exist in the current repo, Git can't do anything with it. That's where the .gitmodules file comes in, to associate a given path with a repo, so that Git can look up the Commit object in that repo.

Re: Mounting Git commits as folders with NFS

#10
post #4

Reminds me of Rational ClearCase, which probably inspired the idea. You could specify a "view" using tags, and it'd present it as a filesystem to remote machines. I think IBM now own them.

It also reminds me of ClearCase, which is why I kind of hate this, lol. ClearCase is fucking awful to work with, the last thing I want is to turn git into it.
Post reply on HN