Formerly gitlabfs
gitforgefs allows you to mount and navigate git forges (Github, Gitlab, Gitea, etc.) as a FUSE filesystem with every groups, organization, and users represented as a folder and every repositories represented as a symlink pointing on a local clone of the project. This is helpful to automate the organization of your local clones.
To help illustrate, this is the output of tree in a filesystem exposing all the repositories of a github user.
$ tree
.
└── badjware
├── aws-cloud-gaming -> /home/marchambault/.local/share/gitforgefs/github.com/257091317
├── certbot -> /home/marchambault/.local/share/gitforgefs/github.com/122014287
├── certbot-dns-cpanel -> /home/marchambault/.local/share/gitforgefs/github.com/131224547
├── certbot-dns-ispconfig -> /home/marchambault/.local/share/gitforgefs/github.com/227005814
├── CommonLibVR -> /home/marchambault/.local/share/gitforgefs/github.com/832968971
├── community -> /home/marchambault/.local/share/gitforgefs/github.com/424689724
├── docker-postal -> /home/marchambault/.local/share/gitforgefs/github.com/132605640
├── dotfiles -> /home/marchambault/.local/share/gitforgefs/github.com/192993195
├── ecommerce-exporter -> /home/marchambault/.local/share/gitforgefs/github.com/562583906
├── FightClub5eXML -> /home/marchambault/.local/share/gitforgefs/github.com/246177579
├── gitforgefs -> /home/marchambault/.local/share/gitforgefs/github.com/324617595
├── kustomize-plugins -> /home/marchambault/.local/share/gitforgefs/github.com/263480122
├── librechat-mistral -> /home/marchambault/.local/share/gitforgefs/github.com/753193720
├── PapyrusExtenderSSE -> /home/marchambault/.local/share/gitforgefs/github.com/832969611
├── Parsec-Cloud-Preparation-Tool -> /home/marchambault/.local/share/gitforgefs/github.com/258052650
├── po3-Tweaks -> /home/marchambault/.local/share/gitforgefs/github.com/832969112
├── prometheus-ecs-discovery -> /home/marchambault/.local/share/gitforgefs/github.com/187891900
├── simplefuse -> /home/marchambault/.local/share/gitforgefs/github.com/111226611
├── tmux-continuum -> /home/marchambault/.local/share/gitforgefs/github.com/160746043
├── ttyd -> /home/marchambault/.local/share/gitforgefs/github.com/132514236
├── usb-libvirt-hotplug -> /home/marchambault/.local/share/gitforgefs/github.com/128696299
└── vfio-win10 -> /home/marchambault/.local/share/gitforgefs/github.com/388475049
24 directories, 0 files
Currently, the following forges are supported:
| Forge | Name in configuration | API token permissions, if using an API key |
|---|---|---|
| Gitlab | gitlab |
read_user, read_api |
| Github | github |
repo |
| Gitea | gitea |
organization: read, repository: read, user: read |
| Forgejo | gitea |
organization: read, repository: read, user: read |
Merge requests to add support to other forges are welcome.
Install go and run
go install github.com/badjware/gitforgefs@latestThe executable will be in $GOPATH/bin/gitforgefs or ~/go/bin/gitforgefs by default. For convenience, add ~/go/bin in your $PATH if not done already.
Download the example configuration file and edit the default configuration to suit your needs.
Then, you can run gitforgefs as follows:
gitforgefs -config config.yaml /path/to/mountpointStopping gitforgefs will unmount the filesystem. In the event the mountpoint is stuck in a bad state (eg: due to receiving a SIGKILL), you may need to manually cleanup using umount:
sudo umount /path/to/mountpointSee ./contrib/systemd for instructions on how to configure a systemd service to automatically run gitforgefs on user login.
To reduce the number of calls to the APIs and improve the responsiveness of the filesystem, gitforgefs will cache the content of the forge in memory. If a group or project is renamed, created or deleted from the forge, these change will not appear in the filesystem immediately. To force gitforgefs to refresh its cache, use touch .refresh in the folder to signal gitforgefs to refresh this folder.
While the filesystem lives in memory, the git repositories that are cloned are saved on disk. By default, they are saved in $XDG_DATA_HOME/gitforgefs or $HOME/.local/share/gitforgefs, if $XDG_DATA_HOME is unset. gitforgefs symlink to the local clone of that repo. The local clone is unaffected by project rename or archive/unarchive in Gitlab and a given project will always point to the correct local folder.
- Cache persists forever until a manual refresh is requested. Some way to automatically refresh after a timeout would be nice.
Simply use make to create the executable. The executable will be in bin/.
See make help for all available targets.