AI prompts
base on # git commit folders
Gives you a folder for every commit in your git repository.
Extremely experimental software with lots of bugs but it works for me and I've
found it a tiny bit useful.
### how to use it
```
go build
./git-commit-folders -type nfs -mountpoint /tmp/mntdir
```
It'll mount a `/tmp/mntdir` directory with all your commits in it, then in another terminal tab you can run:
```
ls /tmp/mntdir
```
### how it works
It mounts a virtual filesystem (using NFS, fuse, or WebDav) and mounts it with
the `mount` command. It doesn't work on Windows but probably could be made to.
Because the filesystem is backed by your `.git` directory, it doesn't use any
disk space. It more or less updates live, though I've noticed that sometimes
the NFS version lags behind a bit, probably because of caching.
### NFS, FUSE, DAV
there are 3 different filesystem implementations. I'd suggest:
* `-type fuse` if you're on Linux
* `-type nfs` if you're on Mac OS (because FUSE on Mac is annoying)
* `-type webdav` is broken because I couldn't get symlinks on webdav to work. just leaving the webdav code in there in case it's salvageable.
You can try to use the FUSE version on Mac with MacFuse or FUSE-T if you want though.
### a tour of the folders
I might change all of this but right now there are four main subfolders.
`commits/` contains all the commits, and everything else is a symlink to a
commit.
```
$ ls /tmp/mntdir
branches/ branch_histories/ commits/ tags/
```
**commits**
the `commits/` directory is split by commit prefix so that it isn't horrible to list. For example:
```
$ ls /tmp/mntdir/commits/
0a 02 1a 2c 3e 5a 6c 7e 9a 12 20 28 36 44 52 60 68 76
$ ls /tmp/mntdir/commits/73/73a0/
73a08ab44ccbf1a305c458c35ab35661f0b7a7f3
$ ls /tmp/mntdir/commits/da/da83/da83dce00782814ecfd33ef6d968ff9e43188a94/
branches.go commit.go go.mod go.sum main.go symlink.go
```
**tags**
```
$ ls /tmp/mntdir/tags/
v0.000@
$ ls /tmp/mntdir/tags/v0.000/
branches.go branch_histories.go commit.go go.mod go.sum main.go symlink.go tags.go
```
**branches**
```
$ ls /tmp/mntdir/branches/
main@ test@
$ ls /tmp/mntdir/branches/main/
branches.go branch_histories.go commit.go go.mod go.sum main.go symlink.go
```
**branch histories**
shows the last 100 commits on a branch. They're numbered, 0 is the most recent.
here we'll look at the code from 4 versions ago
```
$ ls /tmp/mntdir/branch_histories/main/
00-f1e4200744ae2fbe584d3ad3638cf61593a11624@ 02-dc49186e766bcdb62a3958533a62d3fd626b253e@ 04-b9c9e9f09cc918825066f105d62c550cc3c0958e@
01-03bf66122c3acf44fb781f27cd41415af75fcbe4@ 03-da83dce00782814ecfd33ef6d968ff9e43188a94@ 05-97d8dea79acb702b3ad66e08218c26c2fda9b1de@
$ ls /tmp/mntdir/branch_histories/main/04-b9c9e9f09cc918825066f105d62c550cc3c0958e/
commit.go go.mod go.sum main.go
```
### cool stuff you can do
you can go into your branch and grep for the code you deleted!
```
$ cd /tmp/mntdir/branch_histories/main
$ grep 'func readBlob' */commit.go
03-fc450bb99460b9b793fcc36ca79b74caf6a9bc2a/commit.go:func readBlob(repo *git.Repository, id plumbing.Hash) ([]byte, error) {
```
### bugs
there are 1 million bugs and limitations. I may or may not ever fix any of
them. It's read only so it shouldn't do any harm to your git repository though,
I think the worst thing that can happen is that it'll mislead you about
something or be really slow to unmount. Also it caches every commit ID in your
repository in memory so maybe that's bad if you have a truly gigantic
repository.
### thanks
thanks to [vasi](https://github.com/vasi) for explaining one hundred things about filesystems to me
### similar projects
* Rust Git FUSE: https://github.com/fanzeyi/giblefs
* Swift GIT FUSE: https://belkadan.com/blog/2023/11/GitMounter/
* git for plan 9: https://orib.dev/git9.html
", Assign "at most 3 tags" to the expected json: {"id":"5654","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"