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@latest
The 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/mountpoint
Stopping 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/mountpoint
See ./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.