Repository files navigation

gits is a Git repository group manager. It helps you efficiently clone, pull, clean, convert, delete, and track the status of many repositories—organized by group—using a single YAML configuration file.


📦 Features

  • Define repositories in logical groups
  • Use alias, target_path, and do_not_delete for fine-grained control
  • CLI powered by Typer
  • Fast installs and dependency management via uv
  • Supports dry-run and verbose modes
  • Works seamlessly on Arch Linux and Ubuntu

🚀 Installation

Installs gits to ~/.gits and links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/install.sh)"

This will:

Install uv if missing

Clone this repo into ~/.gits

Create a .venv and install dependencies

Symlink the CLI to ~/.local/bin/gits

Copy a default repository_locations.yml if one doesn't already exist

Ensure ~/.local/bin is in your PATH:``

🧹 Uninstall

To remove everything installed by gits:

Removes gits from ~/.gits and removes links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/uninstall.sh)"

This will:

Remove the ~/.gits directory

Remove the CLI symlink from ~/.local/bin/gits

🧾 Default repository_locations.yml

editor:
- root_dir: ~/editor
- repositories:
- alias: LazyVimurl: https://github.com/LazyVim/starter
- alias: lazy.nvimurl: https://github.com/folke/lazy.nvim
- alias: neovimurl: https://github.com/neovim/neovimfzf:
- root_dir: ~/fzf
- repositories:
- alias: fzfurl: https://github.com/junegunn/fzf-git.sh
- alias: everythingurl: https://github.com/junegunn/everything.fzfhyprland:
- root_dir: ~/hyprland
- repositories:
- alias: Dotsurl: https://github.com/JaKooLit/Hyprland-Dots
- alias: Archurl: https://github.com/JaKooLit/Arch-Hyprlandplugins:
- root_dir: ~/plugins
- repositories:
- alias: neo-treeurl: https://github.com/nvim-neo-tree/neo-tree.nvim
- alias: telescopeurl: https://github.com/nvim-telescope/telescope.nvim
- alias: fugitiveurl: https://github.com/tpope/vim-fugitivetraap:
- root_dir: ~/traap
- repositories:
- alias: archlinuxurl: git@github.com:Traap/bootstrap-archlinux
- alias: gitsurl: git@github.com:Traap/gitsdo_not_delete: true
- alias: nvimsurl: git@github.com:Traap/nvimsdo_not_delete: true
- alias: vimtexurl: https://github.com/lervag/vimtexdo_not_delete: false

🧠 Usage

🧪 Help

gits --help
 Usage: gits [OPTIONS] COMMAND [ARGS]... Manage git repositories defined in YAML configuration.╭─ Options ────────────────────────────────────────────────────────────────────╮│ --repo-group -r TEXT [default: None] ││ --verbose -v ││ --dry-run -n ││ --install-completion Install completion for the current ││ shell. ││ --show-completion Show completion for the current shell, ││ to copy it or customize the ││ installation. ││ --help Show this message and exit. │╰──────────────────────────────────────────────────────────────────────────────╯╭─ Commands ───────────────────────────────────────────────────────────────────╮│ clean Clean listed repositories by resetting and removing untracked ││ files, including subfolders. ││ clone Clone repositories listed in the YAML file. ││ convert Convert UTF-16 files to UTF-8 in all repositories. ││ doctor Run environment and configuration checks for gits. ││ delete Delete repositories listed in YAML that are not protected by ││ do_not_delete. ││ list List repository groups and optionally their repositories. ││ pull Pull changes for all repositories including unlisted ones. ││ status Print git status for all repositories. │╰──────────────────────────────────────────────────────────────────────────────╯

🧪 List

gits List
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap
gits list -v
🗂️ editor 🗃️ LazyVim 🗃️ lazy.nvim 🗃️ neovim🗂️ fzf 🗃️ fzf 🗃️ everything🗂️ hyprland 🗃️ Dots 🗃️ Arch🗂️ plugins 🗃️ neo-tree 🗃️ telescope 🗃️ fugitive🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex
gits list -v -r traap
🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex

🧪 Clone

Clone runs 4 jobs concurrently so console output is interwoven.

gits clone
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap 📥 Cloned: fzf 📥 Cloned: LazyVim 📥 Cloned: lazy.nvim 📥 Cloned: everything 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: nvims 📥 Cloned: vimtex 📥 Cloned: Arch 📥 Cloned: neovim 📥 Cloned: Dots
gits clone -v -n
🗂️ editor 📥 (dry-run) clone https://github.com/LazyVim/starter /home/traap/editor/LazyVim 📥 (dry-run) clone https://github.com/folke/lazy.nvim /home/traap/editor/lazy.nvim🗂️ fzf 📥 (dry-run) clone https://github.com/junegunn/everything.fzf /home/traap/fzf/everything 📥 (dry-run) clone https://github.com/junegunn/fzf-git.sh /home/traap/fzf/fzf🗂️ hyprland 📥 (dry-run) clone https://github.com/neovim/neovim /home/traap/editor/neovim 📥 (dry-run) clone https://github.com/JaKooLit/Arch-Hyprland /home/traap/hyprland/Arch 📥 (dry-run) clone https://github.com/JaKooLit/Hyprland-Dots /home/traap/hyprland/Dots🗂️ plugins 📥 (dry-run) clone https://github.com/nvim-telescope/telescope.nvim /home/traap/plugins/telescope 📥 (dry-run) clone https://github.com/nvim-neo-tree/neo-tree.nvim /home/traap/plugins/neo-tree 📥 (dry-run) clone https://github.com/tpope/vim-fugitive /home/traap/plugins/fugitive🗂️ traap ⚠️ Exists: archlinux ⚠️ Exists: gits ⚠️ Exists: nvims ⚠️ Exists: vimtex
gits clone -v -r traap
🗂️ traapCloning into '/home/traap/traap/archlinux'...Cloning into '/home/traap/traap/gits'...Cloning into '/home/traap/traap/nvims'...Cloning into '/home/traap/traap/vimtex'...POST git-upload-pack (181 bytes)POST git-upload-pack (gzip 1623 to 846 bytes) 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: vimtex 📥 Cloned: nvims

🧪 Status

gits status

No output when there are not any errors.

gits status -v
🗂️ editor 🧹 Clean: LazyVim 🧹 Clean: lazy.nvim 🧹 Clean: neovim🗂️ fzf 🧹 Clean: fzf 🧹 Clean: everything🗂️ hyprland 🧹 Clean: Dots 🧹 Clean: Arch🗂️ plugins 🧹 Clean: neo-tree 🧹 Clean: telescope 🧹 Clean: fugitive🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧹 Clean: vimtex
gits status -v -r traap
🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧠 Modified: vimtex M README.md	?? new-file stash@{0}: On master: gits status demo

🧪 Clean

gits clean -n
🧹 (dry-run) would clean LazyVim at /home/traap/editor/LazyVim🧹 (dry-run) would clean lazy.nvim at /home/traap/editor/lazy.nvim🧹 (dry-run) would clean neovim at /home/traap/editor/neovim🧹 (dry-run) would clean everything at /home/traap/fzf/everything🧹 (dry-run) would clean fzf at /home/traap/fzf/fzf🧹 (dry-run) would clean Dots at /home/traap/hyprland/Dots🧹 (dry-run) would clean Arch at /home/traap/hyprland/Arch🧹 (dry-run) would clean telescope at /home/traap/plugins/telescope🧹 (dry-run) would clean neo-tree at /home/traap/plugins/neo-tree🧹 (dry-run) would clean fugitive at /home/traap/plugins/fugitive🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims
gits clean -v
HEAD is now at 803bc18 docs: Explain more about how to add and remove autocmds (#105)HEAD is now at 6c3bda4 chore(main): release 11.17.1 (#1927)HEAD is now at 3ec3e97 Support opening GitHub URLs via WSL (#75)🧹 LazyVim: cleaned successfully🧹 fzf: cleaned successfully🧹 lazy.nvim: cleaned successfullyHEAD is now at a13eb03 Add wiki.fzfHEAD is now at 8813180 Merge pull request #289 from JaKooLit/development🧹 everything: cleaned successfullyHEAD is now at ee8eb7a Update README.de.md🧹 Arch: cleaned successfully🧹 Dots: cleaned successfullyHEAD is now at c7f38e3bc8 fix(api): nvim_parse_cmd parses :map incorrectly #34068HEAD is now at 3f1dd2d fix(renderer): fix cut & paste stack overflow on hidden root (#1792)HEAD is now at 4a745ea Remove antiquated `a` mapHEAD is now at b4da76b fix(lsp): stop using deprecated `client.supports_method` function (#3468)🧹 fugitive: cleaned successfully🧹 neo-tree: cleaned successfully🧹 telescope: cleaned successfullyHEAD is now at ef3e4db Add hyprland and bspwm.HEAD is now at 806d8f6 Update repository locations.HEAD is now at c6d4631 Add installation done message.🧹 neovim: cleaned successfully🧹 archlinux: cleaned successfully🧹 nvims: cleaned successfully🧹 gits: cleaned successfullyHEAD is now at 4b4f18b1 merge: fix test-tkz-euclide.vimRemoving new-file🧹 vimtex: cleaned successfully
gits clean -v -r traap -n
🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims

Doctor

Doctor does not support dryrun or verbose.

gits doctor
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ None ✅ Repos: 14 ✅ Alias: LazyVim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: lazy.nvim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: neovim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: fzf 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: everything 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: Dots 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: Arch 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: neo-tree 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: telescope 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: fugitive 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.
gits doctor -r traap
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ traap ✅ Repos: 4 ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.

🛠️ Development Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

🧪 Delete

Delete will remove all repos within a group and the group itself unless 1) a repo is marked do_not_delete or repo untracked. Untracked repos are not listed in repository_locations.yml.

gits delete
🗂️ editor ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ Deleted: fzf 🗑️ Deleted: everything 🗑️ Deleted: fzf🗂️ hyprland 🗑️ Deleted: Dots 🗑️ Deleted: Arch 🗑️ Deleted: hyprland🗂️ plugins 🗑️ Deleted: neo-tree 🗑️ Deleted: telescope 🗑️ Deleted: fugitive 🗑️ Deleted: plugins🗂️ traap ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -n
🗂️ editor 🗑️ (dry-run) would remove: LazyVim -> /home/traap/editor/LazyVim 🗑️ (dry-run) would remove: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ (dry-run) would remove: neovim -> /home/traap/editor/neovim ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ (dry-run) would remove: fzf -> /home/traap/fzf/fzf 🗑️ (dry-run) would remove: everything -> /home/traap/fzf/everything ⚠️ Not Empty: fzf -> /home/traap/fzf🗂️ hyprland 🗑️ (dry-run) would remove: Dots -> /home/traap/hyprland/Dots 🗑️ (dry-run) would remove: Arch -> /home/traap/hyprland/Arch ⚠️ Not Empty: hyprland -> /home/traap/hyprland🗂️ plugins 🗑️ (dry-run) would remove: neo-tree -> /home/traap/plugins/neo-tree 🗑️ (dry-run) would remove: telescope -> /home/traap/plugins/telescope 🗑️ (dry-run) would remove: fugitive -> /home/traap/plugins/fugitive ⚠️ Not Empty: plugins -> /home/traap/plugins🗂️ traap 🗑️ (dry-run) would remove: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ (dry-run) would remove: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap 🧠 No repositories deleted.
gits delete -v -r traap
🗂️ traap 🗑️ Deleted: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ Deleted: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -r editor
🗂️ editor 🗑️ Deleted: LazyVim -> /home/traap/editor/LazyVim 🗑️ Deleted: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ Deleted: neovim -> /home/traap/editor/neovim 🗑️ Deleted: editor -> /home/traap/editor

🛠️ Development

Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

About

Sync git-based repositories.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

gits is a Git repository group manager. It helps you efficiently clone, pull, clean, convert, delete, and track the status of many repositories—organized by group—using a single YAML configuration file.


📦 Features

  • Define repositories in logical groups
  • Use alias, target_path, and do_not_delete for fine-grained control
  • CLI powered by Typer
  • Fast installs and dependency management via uv
  • Supports dry-run and verbose modes
  • Works seamlessly on Arch Linux and Ubuntu

🚀 Installation

Installs gits to ~/.gits and links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/install.sh)"

This will:

Install uv if missing

Clone this repo into ~/.gits

Create a .venv and install dependencies

Symlink the CLI to ~/.local/bin/gits

Copy a default repository_locations.yml if one doesn't already exist

Ensure ~/.local/bin is in your PATH:``

🧹 Uninstall

To remove everything installed by gits:

Removes gits from ~/.gits and removes links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/uninstall.sh)"

This will:

Remove the ~/.gits directory

Remove the CLI symlink from ~/.local/bin/gits

🧾 Default repository_locations.yml

editor:
- root_dir: ~/editor
- repositories:
- alias: LazyVimurl: https://github.com/LazyVim/starter
- alias: lazy.nvimurl: https://github.com/folke/lazy.nvim
- alias: neovimurl: https://github.com/neovim/neovimfzf:
- root_dir: ~/fzf
- repositories:
- alias: fzfurl: https://github.com/junegunn/fzf-git.sh
- alias: everythingurl: https://github.com/junegunn/everything.fzfhyprland:
- root_dir: ~/hyprland
- repositories:
- alias: Dotsurl: https://github.com/JaKooLit/Hyprland-Dots
- alias: Archurl: https://github.com/JaKooLit/Arch-Hyprlandplugins:
- root_dir: ~/plugins
- repositories:
- alias: neo-treeurl: https://github.com/nvim-neo-tree/neo-tree.nvim
- alias: telescopeurl: https://github.com/nvim-telescope/telescope.nvim
- alias: fugitiveurl: https://github.com/tpope/vim-fugitivetraap:
- root_dir: ~/traap
- repositories:
- alias: archlinuxurl: git@github.com:Traap/bootstrap-archlinux
- alias: gitsurl: git@github.com:Traap/gitsdo_not_delete: true
- alias: nvimsurl: git@github.com:Traap/nvimsdo_not_delete: true
- alias: vimtexurl: https://github.com/lervag/vimtexdo_not_delete: false

🧠 Usage

🧪 Help

gits --help
 Usage: gits [OPTIONS] COMMAND [ARGS]... Manage git repositories defined in YAML configuration.╭─ Options ────────────────────────────────────────────────────────────────────╮│ --repo-group -r TEXT [default: None] ││ --verbose -v ││ --dry-run -n ││ --install-completion Install completion for the current ││ shell. ││ --show-completion Show completion for the current shell, ││ to copy it or customize the ││ installation. ││ --help Show this message and exit. │╰──────────────────────────────────────────────────────────────────────────────╯╭─ Commands ───────────────────────────────────────────────────────────────────╮│ clean Clean listed repositories by resetting and removing untracked ││ files, including subfolders. ││ clone Clone repositories listed in the YAML file. ││ convert Convert UTF-16 files to UTF-8 in all repositories. ││ doctor Run environment and configuration checks for gits. ││ delete Delete repositories listed in YAML that are not protected by ││ do_not_delete. ││ list List repository groups and optionally their repositories. ││ pull Pull changes for all repositories including unlisted ones. ││ status Print git status for all repositories. │╰──────────────────────────────────────────────────────────────────────────────╯

🧪 List

gits List
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap
gits list -v
🗂️ editor 🗃️ LazyVim 🗃️ lazy.nvim 🗃️ neovim🗂️ fzf 🗃️ fzf 🗃️ everything🗂️ hyprland 🗃️ Dots 🗃️ Arch🗂️ plugins 🗃️ neo-tree 🗃️ telescope 🗃️ fugitive🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex
gits list -v -r traap
🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex

🧪 Clone

Clone runs 4 jobs concurrently so console output is interwoven.

gits clone
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap 📥 Cloned: fzf 📥 Cloned: LazyVim 📥 Cloned: lazy.nvim 📥 Cloned: everything 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: nvims 📥 Cloned: vimtex 📥 Cloned: Arch 📥 Cloned: neovim 📥 Cloned: Dots
gits clone -v -n
🗂️ editor 📥 (dry-run) clone https://github.com/LazyVim/starter /home/traap/editor/LazyVim 📥 (dry-run) clone https://github.com/folke/lazy.nvim /home/traap/editor/lazy.nvim🗂️ fzf 📥 (dry-run) clone https://github.com/junegunn/everything.fzf /home/traap/fzf/everything 📥 (dry-run) clone https://github.com/junegunn/fzf-git.sh /home/traap/fzf/fzf🗂️ hyprland 📥 (dry-run) clone https://github.com/neovim/neovim /home/traap/editor/neovim 📥 (dry-run) clone https://github.com/JaKooLit/Arch-Hyprland /home/traap/hyprland/Arch 📥 (dry-run) clone https://github.com/JaKooLit/Hyprland-Dots /home/traap/hyprland/Dots🗂️ plugins 📥 (dry-run) clone https://github.com/nvim-telescope/telescope.nvim /home/traap/plugins/telescope 📥 (dry-run) clone https://github.com/nvim-neo-tree/neo-tree.nvim /home/traap/plugins/neo-tree 📥 (dry-run) clone https://github.com/tpope/vim-fugitive /home/traap/plugins/fugitive🗂️ traap ⚠️ Exists: archlinux ⚠️ Exists: gits ⚠️ Exists: nvims ⚠️ Exists: vimtex
gits clone -v -r traap
🗂️ traapCloning into '/home/traap/traap/archlinux'...Cloning into '/home/traap/traap/gits'...Cloning into '/home/traap/traap/nvims'...Cloning into '/home/traap/traap/vimtex'...POST git-upload-pack (181 bytes)POST git-upload-pack (gzip 1623 to 846 bytes) 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: vimtex 📥 Cloned: nvims

🧪 Status

gits status

No output when there are not any errors.

gits status -v
🗂️ editor 🧹 Clean: LazyVim 🧹 Clean: lazy.nvim 🧹 Clean: neovim🗂️ fzf 🧹 Clean: fzf 🧹 Clean: everything🗂️ hyprland 🧹 Clean: Dots 🧹 Clean: Arch🗂️ plugins 🧹 Clean: neo-tree 🧹 Clean: telescope 🧹 Clean: fugitive🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧹 Clean: vimtex
gits status -v -r traap
🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧠 Modified: vimtex M README.md	?? new-file stash@{0}: On master: gits status demo

🧪 Clean

gits clean -n
🧹 (dry-run) would clean LazyVim at /home/traap/editor/LazyVim🧹 (dry-run) would clean lazy.nvim at /home/traap/editor/lazy.nvim🧹 (dry-run) would clean neovim at /home/traap/editor/neovim🧹 (dry-run) would clean everything at /home/traap/fzf/everything🧹 (dry-run) would clean fzf at /home/traap/fzf/fzf🧹 (dry-run) would clean Dots at /home/traap/hyprland/Dots🧹 (dry-run) would clean Arch at /home/traap/hyprland/Arch🧹 (dry-run) would clean telescope at /home/traap/plugins/telescope🧹 (dry-run) would clean neo-tree at /home/traap/plugins/neo-tree🧹 (dry-run) would clean fugitive at /home/traap/plugins/fugitive🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims
gits clean -v
HEAD is now at 803bc18 docs: Explain more about how to add and remove autocmds (#105)HEAD is now at 6c3bda4 chore(main): release 11.17.1 (#1927)HEAD is now at 3ec3e97 Support opening GitHub URLs via WSL (#75)🧹 LazyVim: cleaned successfully🧹 fzf: cleaned successfully🧹 lazy.nvim: cleaned successfullyHEAD is now at a13eb03 Add wiki.fzfHEAD is now at 8813180 Merge pull request #289 from JaKooLit/development🧹 everything: cleaned successfullyHEAD is now at ee8eb7a Update README.de.md🧹 Arch: cleaned successfully🧹 Dots: cleaned successfullyHEAD is now at c7f38e3bc8 fix(api): nvim_parse_cmd parses :map incorrectly #34068HEAD is now at 3f1dd2d fix(renderer): fix cut & paste stack overflow on hidden root (#1792)HEAD is now at 4a745ea Remove antiquated `a` mapHEAD is now at b4da76b fix(lsp): stop using deprecated `client.supports_method` function (#3468)🧹 fugitive: cleaned successfully🧹 neo-tree: cleaned successfully🧹 telescope: cleaned successfullyHEAD is now at ef3e4db Add hyprland and bspwm.HEAD is now at 806d8f6 Update repository locations.HEAD is now at c6d4631 Add installation done message.🧹 neovim: cleaned successfully🧹 archlinux: cleaned successfully🧹 nvims: cleaned successfully🧹 gits: cleaned successfullyHEAD is now at 4b4f18b1 merge: fix test-tkz-euclide.vimRemoving new-file🧹 vimtex: cleaned successfully
gits clean -v -r traap -n
🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims

Doctor

Doctor does not support dryrun or verbose.

gits doctor
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ None ✅ Repos: 14 ✅ Alias: LazyVim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: lazy.nvim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: neovim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: fzf 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: everything 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: Dots 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: Arch 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: neo-tree 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: telescope 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: fugitive 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.
gits doctor -r traap
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ traap ✅ Repos: 4 ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.

🛠️ Development Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

🧪 Delete

Delete will remove all repos within a group and the group itself unless 1) a repo is marked do_not_delete or repo untracked. Untracked repos are not listed in repository_locations.yml.

gits delete
🗂️ editor ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ Deleted: fzf 🗑️ Deleted: everything 🗑️ Deleted: fzf🗂️ hyprland 🗑️ Deleted: Dots 🗑️ Deleted: Arch 🗑️ Deleted: hyprland🗂️ plugins 🗑️ Deleted: neo-tree 🗑️ Deleted: telescope 🗑️ Deleted: fugitive 🗑️ Deleted: plugins🗂️ traap ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -n
🗂️ editor 🗑️ (dry-run) would remove: LazyVim -> /home/traap/editor/LazyVim 🗑️ (dry-run) would remove: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ (dry-run) would remove: neovim -> /home/traap/editor/neovim ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ (dry-run) would remove: fzf -> /home/traap/fzf/fzf 🗑️ (dry-run) would remove: everything -> /home/traap/fzf/everything ⚠️ Not Empty: fzf -> /home/traap/fzf🗂️ hyprland 🗑️ (dry-run) would remove: Dots -> /home/traap/hyprland/Dots 🗑️ (dry-run) would remove: Arch -> /home/traap/hyprland/Arch ⚠️ Not Empty: hyprland -> /home/traap/hyprland🗂️ plugins 🗑️ (dry-run) would remove: neo-tree -> /home/traap/plugins/neo-tree 🗑️ (dry-run) would remove: telescope -> /home/traap/plugins/telescope 🗑️ (dry-run) would remove: fugitive -> /home/traap/plugins/fugitive ⚠️ Not Empty: plugins -> /home/traap/plugins🗂️ traap 🗑️ (dry-run) would remove: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ (dry-run) would remove: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap 🧠 No repositories deleted.
gits delete -v -r traap
🗂️ traap 🗑️ Deleted: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ Deleted: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -r editor
🗂️ editor 🗑️ Deleted: LazyVim -> /home/traap/editor/LazyVim 🗑️ Deleted: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ Deleted: neovim -> /home/traap/editor/neovim 🗑️ Deleted: editor -> /home/traap/editor

🛠️ Development

Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

About

Sync git-based repositories.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gits is a Git repository group manager. It helps you efficiently clone, pull, clean, convert, delete, and track the status of many repositories—organized by group—using a single YAML configuration file.


📦 Features

  • Define repositories in logical groups
  • Use alias, target_path, and do_not_delete for fine-grained control
  • CLI powered by Typer
  • Fast installs and dependency management via uv
  • Supports dry-run and verbose modes
  • Works seamlessly on Arch Linux and Ubuntu

🚀 Installation

Installs gits to ~/.gits and links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/install.sh)"

This will:

Install uv if missing

Clone this repo into ~/.gits

Create a .venv and install dependencies

Symlink the CLI to ~/.local/bin/gits

Copy a default repository_locations.yml if one doesn't already exist

Ensure ~/.local/bin is in your PATH:``

🧹 Uninstall

To remove everything installed by gits:

Removes gits from ~/.gits and removes links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/uninstall.sh)"

This will:

Remove the ~/.gits directory

Remove the CLI symlink from ~/.local/bin/gits

🧾 Default repository_locations.yml

editor:
- root_dir: ~/editor
- repositories:
- alias: LazyVimurl: https://github.com/LazyVim/starter
- alias: lazy.nvimurl: https://github.com/folke/lazy.nvim
- alias: neovimurl: https://github.com/neovim/neovimfzf:
- root_dir: ~/fzf
- repositories:
- alias: fzfurl: https://github.com/junegunn/fzf-git.sh
- alias: everythingurl: https://github.com/junegunn/everything.fzfhyprland:
- root_dir: ~/hyprland
- repositories:
- alias: Dotsurl: https://github.com/JaKooLit/Hyprland-Dots
- alias: Archurl: https://github.com/JaKooLit/Arch-Hyprlandplugins:
- root_dir: ~/plugins
- repositories:
- alias: neo-treeurl: https://github.com/nvim-neo-tree/neo-tree.nvim
- alias: telescopeurl: https://github.com/nvim-telescope/telescope.nvim
- alias: fugitiveurl: https://github.com/tpope/vim-fugitivetraap:
- root_dir: ~/traap
- repositories:
- alias: archlinuxurl: git@github.com:Traap/bootstrap-archlinux
- alias: gitsurl: git@github.com:Traap/gitsdo_not_delete: true
- alias: nvimsurl: git@github.com:Traap/nvimsdo_not_delete: true
- alias: vimtexurl: https://github.com/lervag/vimtexdo_not_delete: false

🧠 Usage

🧪 Help

gits --help
 Usage: gits [OPTIONS] COMMAND [ARGS]... Manage git repositories defined in YAML configuration.╭─ Options ────────────────────────────────────────────────────────────────────╮│ --repo-group -r TEXT [default: None] ││ --verbose -v ││ --dry-run -n ││ --install-completion Install completion for the current ││ shell. ││ --show-completion Show completion for the current shell, ││ to copy it or customize the ││ installation. ││ --help Show this message and exit. │╰──────────────────────────────────────────────────────────────────────────────╯╭─ Commands ───────────────────────────────────────────────────────────────────╮│ clean Clean listed repositories by resetting and removing untracked ││ files, including subfolders. ││ clone Clone repositories listed in the YAML file. ││ convert Convert UTF-16 files to UTF-8 in all repositories. ││ doctor Run environment and configuration checks for gits. ││ delete Delete repositories listed in YAML that are not protected by ││ do_not_delete. ││ list List repository groups and optionally their repositories. ││ pull Pull changes for all repositories including unlisted ones. ││ status Print git status for all repositories. │╰──────────────────────────────────────────────────────────────────────────────╯

🧪 List

gits List
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap
gits list -v
🗂️ editor 🗃️ LazyVim 🗃️ lazy.nvim 🗃️ neovim🗂️ fzf 🗃️ fzf 🗃️ everything🗂️ hyprland 🗃️ Dots 🗃️ Arch🗂️ plugins 🗃️ neo-tree 🗃️ telescope 🗃️ fugitive🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex
gits list -v -r traap
🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex

🧪 Clone

Clone runs 4 jobs concurrently so console output is interwoven.

gits clone
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap 📥 Cloned: fzf 📥 Cloned: LazyVim 📥 Cloned: lazy.nvim 📥 Cloned: everything 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: nvims 📥 Cloned: vimtex 📥 Cloned: Arch 📥 Cloned: neovim 📥 Cloned: Dots
gits clone -v -n
🗂️ editor 📥 (dry-run) clone https://github.com/LazyVim/starter /home/traap/editor/LazyVim 📥 (dry-run) clone https://github.com/folke/lazy.nvim /home/traap/editor/lazy.nvim🗂️ fzf 📥 (dry-run) clone https://github.com/junegunn/everything.fzf /home/traap/fzf/everything 📥 (dry-run) clone https://github.com/junegunn/fzf-git.sh /home/traap/fzf/fzf🗂️ hyprland 📥 (dry-run) clone https://github.com/neovim/neovim /home/traap/editor/neovim 📥 (dry-run) clone https://github.com/JaKooLit/Arch-Hyprland /home/traap/hyprland/Arch 📥 (dry-run) clone https://github.com/JaKooLit/Hyprland-Dots /home/traap/hyprland/Dots🗂️ plugins 📥 (dry-run) clone https://github.com/nvim-telescope/telescope.nvim /home/traap/plugins/telescope 📥 (dry-run) clone https://github.com/nvim-neo-tree/neo-tree.nvim /home/traap/plugins/neo-tree 📥 (dry-run) clone https://github.com/tpope/vim-fugitive /home/traap/plugins/fugitive🗂️ traap ⚠️ Exists: archlinux ⚠️ Exists: gits ⚠️ Exists: nvims ⚠️ Exists: vimtex
gits clone -v -r traap
🗂️ traapCloning into '/home/traap/traap/archlinux'...Cloning into '/home/traap/traap/gits'...Cloning into '/home/traap/traap/nvims'...Cloning into '/home/traap/traap/vimtex'...POST git-upload-pack (181 bytes)POST git-upload-pack (gzip 1623 to 846 bytes) 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: vimtex 📥 Cloned: nvims

🧪 Status

gits status

No output when there are not any errors.

gits status -v
🗂️ editor 🧹 Clean: LazyVim 🧹 Clean: lazy.nvim 🧹 Clean: neovim🗂️ fzf 🧹 Clean: fzf 🧹 Clean: everything🗂️ hyprland 🧹 Clean: Dots 🧹 Clean: Arch🗂️ plugins 🧹 Clean: neo-tree 🧹 Clean: telescope 🧹 Clean: fugitive🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧹 Clean: vimtex
gits status -v -r traap
🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧠 Modified: vimtex M README.md	?? new-file stash@{0}: On master: gits status demo

🧪 Clean

gits clean -n
🧹 (dry-run) would clean LazyVim at /home/traap/editor/LazyVim🧹 (dry-run) would clean lazy.nvim at /home/traap/editor/lazy.nvim🧹 (dry-run) would clean neovim at /home/traap/editor/neovim🧹 (dry-run) would clean everything at /home/traap/fzf/everything🧹 (dry-run) would clean fzf at /home/traap/fzf/fzf🧹 (dry-run) would clean Dots at /home/traap/hyprland/Dots🧹 (dry-run) would clean Arch at /home/traap/hyprland/Arch🧹 (dry-run) would clean telescope at /home/traap/plugins/telescope🧹 (dry-run) would clean neo-tree at /home/traap/plugins/neo-tree🧹 (dry-run) would clean fugitive at /home/traap/plugins/fugitive🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims
gits clean -v
HEAD is now at 803bc18 docs: Explain more about how to add and remove autocmds (#105)HEAD is now at 6c3bda4 chore(main): release 11.17.1 (#1927)HEAD is now at 3ec3e97 Support opening GitHub URLs via WSL (#75)🧹 LazyVim: cleaned successfully🧹 fzf: cleaned successfully🧹 lazy.nvim: cleaned successfullyHEAD is now at a13eb03 Add wiki.fzfHEAD is now at 8813180 Merge pull request #289 from JaKooLit/development🧹 everything: cleaned successfullyHEAD is now at ee8eb7a Update README.de.md🧹 Arch: cleaned successfully🧹 Dots: cleaned successfullyHEAD is now at c7f38e3bc8 fix(api): nvim_parse_cmd parses :map incorrectly #34068HEAD is now at 3f1dd2d fix(renderer): fix cut & paste stack overflow on hidden root (#1792)HEAD is now at 4a745ea Remove antiquated `a` mapHEAD is now at b4da76b fix(lsp): stop using deprecated `client.supports_method` function (#3468)🧹 fugitive: cleaned successfully🧹 neo-tree: cleaned successfully🧹 telescope: cleaned successfullyHEAD is now at ef3e4db Add hyprland and bspwm.HEAD is now at 806d8f6 Update repository locations.HEAD is now at c6d4631 Add installation done message.🧹 neovim: cleaned successfully🧹 archlinux: cleaned successfully🧹 nvims: cleaned successfully🧹 gits: cleaned successfullyHEAD is now at 4b4f18b1 merge: fix test-tkz-euclide.vimRemoving new-file🧹 vimtex: cleaned successfully
gits clean -v -r traap -n
🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims

Doctor

Doctor does not support dryrun or verbose.

gits doctor
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ None ✅ Repos: 14 ✅ Alias: LazyVim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: lazy.nvim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: neovim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: fzf 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: everything 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: Dots 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: Arch 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: neo-tree 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: telescope 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: fugitive 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.
gits doctor -r traap
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ traap ✅ Repos: 4 ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.

🛠️ Development Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

🧪 Delete

Delete will remove all repos within a group and the group itself unless 1) a repo is marked do_not_delete or repo untracked. Untracked repos are not listed in repository_locations.yml.

gits delete
🗂️ editor ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ Deleted: fzf 🗑️ Deleted: everything 🗑️ Deleted: fzf🗂️ hyprland 🗑️ Deleted: Dots 🗑️ Deleted: Arch 🗑️ Deleted: hyprland🗂️ plugins 🗑️ Deleted: neo-tree 🗑️ Deleted: telescope 🗑️ Deleted: fugitive 🗑️ Deleted: plugins🗂️ traap ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -n
🗂️ editor 🗑️ (dry-run) would remove: LazyVim -> /home/traap/editor/LazyVim 🗑️ (dry-run) would remove: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ (dry-run) would remove: neovim -> /home/traap/editor/neovim ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ (dry-run) would remove: fzf -> /home/traap/fzf/fzf 🗑️ (dry-run) would remove: everything -> /home/traap/fzf/everything ⚠️ Not Empty: fzf -> /home/traap/fzf🗂️ hyprland 🗑️ (dry-run) would remove: Dots -> /home/traap/hyprland/Dots 🗑️ (dry-run) would remove: Arch -> /home/traap/hyprland/Arch ⚠️ Not Empty: hyprland -> /home/traap/hyprland🗂️ plugins 🗑️ (dry-run) would remove: neo-tree -> /home/traap/plugins/neo-tree 🗑️ (dry-run) would remove: telescope -> /home/traap/plugins/telescope 🗑️ (dry-run) would remove: fugitive -> /home/traap/plugins/fugitive ⚠️ Not Empty: plugins -> /home/traap/plugins🗂️ traap 🗑️ (dry-run) would remove: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ (dry-run) would remove: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap 🧠 No repositories deleted.
gits delete -v -r traap
🗂️ traap 🗑️ Deleted: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ Deleted: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -r editor
🗂️ editor 🗑️ Deleted: LazyVim -> /home/traap/editor/LazyVim 🗑️ Deleted: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ Deleted: neovim -> /home/traap/editor/neovim 🗑️ Deleted: editor -> /home/traap/editor

🛠️ Development

Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

About

Sync git-based repositories.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gits is a Git repository group manager. It helps you efficiently clone, pull, clean, convert, delete, and track the status of many repositories—organized by group—using a single YAML configuration file.


📦 Features

  • Define repositories in logical groups
  • Use alias, target_path, and do_not_delete for fine-grained control
  • CLI powered by Typer
  • Fast installs and dependency management via uv
  • Supports dry-run and verbose modes
  • Works seamlessly on Arch Linux and Ubuntu

🚀 Installation

Installs gits to ~/.gits and links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/install.sh)"

This will:

Install uv if missing

Clone this repo into ~/.gits

Create a .venv and install dependencies

Symlink the CLI to ~/.local/bin/gits

Copy a default repository_locations.yml if one doesn't already exist

Ensure ~/.local/bin is in your PATH:``

🧹 Uninstall

To remove everything installed by gits:

Removes gits from ~/.gits and removes links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/uninstall.sh)"

This will:

Remove the ~/.gits directory

Remove the CLI symlink from ~/.local/bin/gits

🧾 Default repository_locations.yml

editor:
- root_dir: ~/editor
- repositories:
- alias: LazyVimurl: https://github.com/LazyVim/starter
- alias: lazy.nvimurl: https://github.com/folke/lazy.nvim
- alias: neovimurl: https://github.com/neovim/neovimfzf:
- root_dir: ~/fzf
- repositories:
- alias: fzfurl: https://github.com/junegunn/fzf-git.sh
- alias: everythingurl: https://github.com/junegunn/everything.fzfhyprland:
- root_dir: ~/hyprland
- repositories:
- alias: Dotsurl: https://github.com/JaKooLit/Hyprland-Dots
- alias: Archurl: https://github.com/JaKooLit/Arch-Hyprlandplugins:
- root_dir: ~/plugins
- repositories:
- alias: neo-treeurl: https://github.com/nvim-neo-tree/neo-tree.nvim
- alias: telescopeurl: https://github.com/nvim-telescope/telescope.nvim
- alias: fugitiveurl: https://github.com/tpope/vim-fugitivetraap:
- root_dir: ~/traap
- repositories:
- alias: archlinuxurl: git@github.com:Traap/bootstrap-archlinux
- alias: gitsurl: git@github.com:Traap/gitsdo_not_delete: true
- alias: nvimsurl: git@github.com:Traap/nvimsdo_not_delete: true
- alias: vimtexurl: https://github.com/lervag/vimtexdo_not_delete: false

🧠 Usage

🧪 Help

gits --help
 Usage: gits [OPTIONS] COMMAND [ARGS]... Manage git repositories defined in YAML configuration.╭─ Options ────────────────────────────────────────────────────────────────────╮│ --repo-group -r TEXT [default: None] ││ --verbose -v ││ --dry-run -n ││ --install-completion Install completion for the current ││ shell. ││ --show-completion Show completion for the current shell, ││ to copy it or customize the ││ installation. ││ --help Show this message and exit. │╰──────────────────────────────────────────────────────────────────────────────╯╭─ Commands ───────────────────────────────────────────────────────────────────╮│ clean Clean listed repositories by resetting and removing untracked ││ files, including subfolders. ││ clone Clone repositories listed in the YAML file. ││ convert Convert UTF-16 files to UTF-8 in all repositories. ││ doctor Run environment and configuration checks for gits. ││ delete Delete repositories listed in YAML that are not protected by ││ do_not_delete. ││ list List repository groups and optionally their repositories. ││ pull Pull changes for all repositories including unlisted ones. ││ status Print git status for all repositories. │╰──────────────────────────────────────────────────────────────────────────────╯

🧪 List

gits List
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap
gits list -v
🗂️ editor 🗃️ LazyVim 🗃️ lazy.nvim 🗃️ neovim🗂️ fzf 🗃️ fzf 🗃️ everything🗂️ hyprland 🗃️ Dots 🗃️ Arch🗂️ plugins 🗃️ neo-tree 🗃️ telescope 🗃️ fugitive🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex
gits list -v -r traap
🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex

🧪 Clone

Clone runs 4 jobs concurrently so console output is interwoven.

gits clone
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap 📥 Cloned: fzf 📥 Cloned: LazyVim 📥 Cloned: lazy.nvim 📥 Cloned: everything 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: nvims 📥 Cloned: vimtex 📥 Cloned: Arch 📥 Cloned: neovim 📥 Cloned: Dots
gits clone -v -n
🗂️ editor 📥 (dry-run) clone https://github.com/LazyVim/starter /home/traap/editor/LazyVim 📥 (dry-run) clone https://github.com/folke/lazy.nvim /home/traap/editor/lazy.nvim🗂️ fzf 📥 (dry-run) clone https://github.com/junegunn/everything.fzf /home/traap/fzf/everything 📥 (dry-run) clone https://github.com/junegunn/fzf-git.sh /home/traap/fzf/fzf🗂️ hyprland 📥 (dry-run) clone https://github.com/neovim/neovim /home/traap/editor/neovim 📥 (dry-run) clone https://github.com/JaKooLit/Arch-Hyprland /home/traap/hyprland/Arch 📥 (dry-run) clone https://github.com/JaKooLit/Hyprland-Dots /home/traap/hyprland/Dots🗂️ plugins 📥 (dry-run) clone https://github.com/nvim-telescope/telescope.nvim /home/traap/plugins/telescope 📥 (dry-run) clone https://github.com/nvim-neo-tree/neo-tree.nvim /home/traap/plugins/neo-tree 📥 (dry-run) clone https://github.com/tpope/vim-fugitive /home/traap/plugins/fugitive🗂️ traap ⚠️ Exists: archlinux ⚠️ Exists: gits ⚠️ Exists: nvims ⚠️ Exists: vimtex
gits clone -v -r traap
🗂️ traapCloning into '/home/traap/traap/archlinux'...Cloning into '/home/traap/traap/gits'...Cloning into '/home/traap/traap/nvims'...Cloning into '/home/traap/traap/vimtex'...POST git-upload-pack (181 bytes)POST git-upload-pack (gzip 1623 to 846 bytes) 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: vimtex 📥 Cloned: nvims

🧪 Status

gits status

No output when there are not any errors.

gits status -v
🗂️ editor 🧹 Clean: LazyVim 🧹 Clean: lazy.nvim 🧹 Clean: neovim🗂️ fzf 🧹 Clean: fzf 🧹 Clean: everything🗂️ hyprland 🧹 Clean: Dots 🧹 Clean: Arch🗂️ plugins 🧹 Clean: neo-tree 🧹 Clean: telescope 🧹 Clean: fugitive🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧹 Clean: vimtex
gits status -v -r traap
🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧠 Modified: vimtex M README.md	?? new-file stash@{0}: On master: gits status demo

🧪 Clean

gits clean -n
🧹 (dry-run) would clean LazyVim at /home/traap/editor/LazyVim🧹 (dry-run) would clean lazy.nvim at /home/traap/editor/lazy.nvim🧹 (dry-run) would clean neovim at /home/traap/editor/neovim🧹 (dry-run) would clean everything at /home/traap/fzf/everything🧹 (dry-run) would clean fzf at /home/traap/fzf/fzf🧹 (dry-run) would clean Dots at /home/traap/hyprland/Dots🧹 (dry-run) would clean Arch at /home/traap/hyprland/Arch🧹 (dry-run) would clean telescope at /home/traap/plugins/telescope🧹 (dry-run) would clean neo-tree at /home/traap/plugins/neo-tree🧹 (dry-run) would clean fugitive at /home/traap/plugins/fugitive🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims
gits clean -v
HEAD is now at 803bc18 docs: Explain more about how to add and remove autocmds (#105)HEAD is now at 6c3bda4 chore(main): release 11.17.1 (#1927)HEAD is now at 3ec3e97 Support opening GitHub URLs via WSL (#75)🧹 LazyVim: cleaned successfully🧹 fzf: cleaned successfully🧹 lazy.nvim: cleaned successfullyHEAD is now at a13eb03 Add wiki.fzfHEAD is now at 8813180 Merge pull request #289 from JaKooLit/development🧹 everything: cleaned successfullyHEAD is now at ee8eb7a Update README.de.md🧹 Arch: cleaned successfully🧹 Dots: cleaned successfullyHEAD is now at c7f38e3bc8 fix(api): nvim_parse_cmd parses :map incorrectly #34068HEAD is now at 3f1dd2d fix(renderer): fix cut & paste stack overflow on hidden root (#1792)HEAD is now at 4a745ea Remove antiquated `a` mapHEAD is now at b4da76b fix(lsp): stop using deprecated `client.supports_method` function (#3468)🧹 fugitive: cleaned successfully🧹 neo-tree: cleaned successfully🧹 telescope: cleaned successfullyHEAD is now at ef3e4db Add hyprland and bspwm.HEAD is now at 806d8f6 Update repository locations.HEAD is now at c6d4631 Add installation done message.🧹 neovim: cleaned successfully🧹 archlinux: cleaned successfully🧹 nvims: cleaned successfully🧹 gits: cleaned successfullyHEAD is now at 4b4f18b1 merge: fix test-tkz-euclide.vimRemoving new-file🧹 vimtex: cleaned successfully
gits clean -v -r traap -n
🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims

Doctor

Doctor does not support dryrun or verbose.

gits doctor
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ None ✅ Repos: 14 ✅ Alias: LazyVim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: lazy.nvim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: neovim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: fzf 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: everything 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: Dots 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: Arch 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: neo-tree 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: telescope 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: fugitive 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.
gits doctor -r traap
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ traap ✅ Repos: 4 ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.

🛠️ Development Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

🧪 Delete

Delete will remove all repos within a group and the group itself unless 1) a repo is marked do_not_delete or repo untracked. Untracked repos are not listed in repository_locations.yml.

gits delete
🗂️ editor ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ Deleted: fzf 🗑️ Deleted: everything 🗑️ Deleted: fzf🗂️ hyprland 🗑️ Deleted: Dots 🗑️ Deleted: Arch 🗑️ Deleted: hyprland🗂️ plugins 🗑️ Deleted: neo-tree 🗑️ Deleted: telescope 🗑️ Deleted: fugitive 🗑️ Deleted: plugins🗂️ traap ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -n
🗂️ editor 🗑️ (dry-run) would remove: LazyVim -> /home/traap/editor/LazyVim 🗑️ (dry-run) would remove: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ (dry-run) would remove: neovim -> /home/traap/editor/neovim ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ (dry-run) would remove: fzf -> /home/traap/fzf/fzf 🗑️ (dry-run) would remove: everything -> /home/traap/fzf/everything ⚠️ Not Empty: fzf -> /home/traap/fzf🗂️ hyprland 🗑️ (dry-run) would remove: Dots -> /home/traap/hyprland/Dots 🗑️ (dry-run) would remove: Arch -> /home/traap/hyprland/Arch ⚠️ Not Empty: hyprland -> /home/traap/hyprland🗂️ plugins 🗑️ (dry-run) would remove: neo-tree -> /home/traap/plugins/neo-tree 🗑️ (dry-run) would remove: telescope -> /home/traap/plugins/telescope 🗑️ (dry-run) would remove: fugitive -> /home/traap/plugins/fugitive ⚠️ Not Empty: plugins -> /home/traap/plugins🗂️ traap 🗑️ (dry-run) would remove: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ (dry-run) would remove: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap 🧠 No repositories deleted.
gits delete -v -r traap
🗂️ traap 🗑️ Deleted: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ Deleted: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -r editor
🗂️ editor 🗑️ Deleted: LazyVim -> /home/traap/editor/LazyVim 🗑️ Deleted: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ Deleted: neovim -> /home/traap/editor/neovim 🗑️ Deleted: editor -> /home/traap/editor

🛠️ Development

Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

About

Sync git-based repositories.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

gits is a Git repository group manager. It helps you efficiently clone, pull, clean, convert, delete, and track the status of many repositories—organized by group—using a single YAML configuration file.


📦 Features

  • Define repositories in logical groups
  • Use alias, target_path, and do_not_delete for fine-grained control
  • CLI powered by Typer
  • Fast installs and dependency management via uv
  • Supports dry-run and verbose modes
  • Works seamlessly on Arch Linux and Ubuntu

🚀 Installation

Installs gits to ~/.gits and links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/install.sh)"

This will:

Install uv if missing

Clone this repo into ~/.gits

Create a .venv and install dependencies

Symlink the CLI to ~/.local/bin/gits

Copy a default repository_locations.yml if one doesn't already exist

Ensure ~/.local/bin is in your PATH:``

🧹 Uninstall

To remove everything installed by gits:

Removes gits from ~/.gits and removes links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/uninstall.sh)"

This will:

Remove the ~/.gits directory

Remove the CLI symlink from ~/.local/bin/gits

🧾 Default repository_locations.yml

editor:
- root_dir: ~/editor
- repositories:
- alias: LazyVimurl: https://github.com/LazyVim/starter
- alias: lazy.nvimurl: https://github.com/folke/lazy.nvim
- alias: neovimurl: https://github.com/neovim/neovimfzf:
- root_dir: ~/fzf
- repositories:
- alias: fzfurl: https://github.com/junegunn/fzf-git.sh
- alias: everythingurl: https://github.com/junegunn/everything.fzfhyprland:
- root_dir: ~/hyprland
- repositories:
- alias: Dotsurl: https://github.com/JaKooLit/Hyprland-Dots
- alias: Archurl: https://github.com/JaKooLit/Arch-Hyprlandplugins:
- root_dir: ~/plugins
- repositories:
- alias: neo-treeurl: https://github.com/nvim-neo-tree/neo-tree.nvim
- alias: telescopeurl: https://github.com/nvim-telescope/telescope.nvim
- alias: fugitiveurl: https://github.com/tpope/vim-fugitivetraap:
- root_dir: ~/traap
- repositories:
- alias: archlinuxurl: git@github.com:Traap/bootstrap-archlinux
- alias: gitsurl: git@github.com:Traap/gitsdo_not_delete: true
- alias: nvimsurl: git@github.com:Traap/nvimsdo_not_delete: true
- alias: vimtexurl: https://github.com/lervag/vimtexdo_not_delete: false

🧠 Usage

🧪 Help

gits --help
 Usage: gits [OPTIONS] COMMAND [ARGS]... Manage git repositories defined in YAML configuration.╭─ Options ────────────────────────────────────────────────────────────────────╮│ --repo-group -r TEXT [default: None] ││ --verbose -v ││ --dry-run -n ││ --install-completion Install completion for the current ││ shell. ││ --show-completion Show completion for the current shell, ││ to copy it or customize the ││ installation. ││ --help Show this message and exit. │╰──────────────────────────────────────────────────────────────────────────────╯╭─ Commands ───────────────────────────────────────────────────────────────────╮│ clean Clean listed repositories by resetting and removing untracked ││ files, including subfolders. ││ clone Clone repositories listed in the YAML file. ││ convert Convert UTF-16 files to UTF-8 in all repositories. ││ doctor Run environment and configuration checks for gits. ││ delete Delete repositories listed in YAML that are not protected by ││ do_not_delete. ││ list List repository groups and optionally their repositories. ││ pull Pull changes for all repositories including unlisted ones. ││ status Print git status for all repositories. │╰──────────────────────────────────────────────────────────────────────────────╯

🧪 List

gits List
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap
gits list -v
🗂️ editor 🗃️ LazyVim 🗃️ lazy.nvim 🗃️ neovim🗂️ fzf 🗃️ fzf 🗃️ everything🗂️ hyprland 🗃️ Dots 🗃️ Arch🗂️ plugins 🗃️ neo-tree 🗃️ telescope 🗃️ fugitive🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex
gits list -v -r traap
🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex

🧪 Clone

Clone runs 4 jobs concurrently so console output is interwoven.

gits clone
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap 📥 Cloned: fzf 📥 Cloned: LazyVim 📥 Cloned: lazy.nvim 📥 Cloned: everything 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: nvims 📥 Cloned: vimtex 📥 Cloned: Arch 📥 Cloned: neovim 📥 Cloned: Dots
gits clone -v -n
🗂️ editor 📥 (dry-run) clone https://github.com/LazyVim/starter /home/traap/editor/LazyVim 📥 (dry-run) clone https://github.com/folke/lazy.nvim /home/traap/editor/lazy.nvim🗂️ fzf 📥 (dry-run) clone https://github.com/junegunn/everything.fzf /home/traap/fzf/everything 📥 (dry-run) clone https://github.com/junegunn/fzf-git.sh /home/traap/fzf/fzf🗂️ hyprland 📥 (dry-run) clone https://github.com/neovim/neovim /home/traap/editor/neovim 📥 (dry-run) clone https://github.com/JaKooLit/Arch-Hyprland /home/traap/hyprland/Arch 📥 (dry-run) clone https://github.com/JaKooLit/Hyprland-Dots /home/traap/hyprland/Dots🗂️ plugins 📥 (dry-run) clone https://github.com/nvim-telescope/telescope.nvim /home/traap/plugins/telescope 📥 (dry-run) clone https://github.com/nvim-neo-tree/neo-tree.nvim /home/traap/plugins/neo-tree 📥 (dry-run) clone https://github.com/tpope/vim-fugitive /home/traap/plugins/fugitive🗂️ traap ⚠️ Exists: archlinux ⚠️ Exists: gits ⚠️ Exists: nvims ⚠️ Exists: vimtex
gits clone -v -r traap
🗂️ traapCloning into '/home/traap/traap/archlinux'...Cloning into '/home/traap/traap/gits'...Cloning into '/home/traap/traap/nvims'...Cloning into '/home/traap/traap/vimtex'...POST git-upload-pack (181 bytes)POST git-upload-pack (gzip 1623 to 846 bytes) 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: vimtex 📥 Cloned: nvims

🧪 Status

gits status

No output when there are not any errors.

gits status -v
🗂️ editor 🧹 Clean: LazyVim 🧹 Clean: lazy.nvim 🧹 Clean: neovim🗂️ fzf 🧹 Clean: fzf 🧹 Clean: everything🗂️ hyprland 🧹 Clean: Dots 🧹 Clean: Arch🗂️ plugins 🧹 Clean: neo-tree 🧹 Clean: telescope 🧹 Clean: fugitive🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧹 Clean: vimtex
gits status -v -r traap
🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧠 Modified: vimtex M README.md	?? new-file stash@{0}: On master: gits status demo

🧪 Clean

gits clean -n
🧹 (dry-run) would clean LazyVim at /home/traap/editor/LazyVim🧹 (dry-run) would clean lazy.nvim at /home/traap/editor/lazy.nvim🧹 (dry-run) would clean neovim at /home/traap/editor/neovim🧹 (dry-run) would clean everything at /home/traap/fzf/everything🧹 (dry-run) would clean fzf at /home/traap/fzf/fzf🧹 (dry-run) would clean Dots at /home/traap/hyprland/Dots🧹 (dry-run) would clean Arch at /home/traap/hyprland/Arch🧹 (dry-run) would clean telescope at /home/traap/plugins/telescope🧹 (dry-run) would clean neo-tree at /home/traap/plugins/neo-tree🧹 (dry-run) would clean fugitive at /home/traap/plugins/fugitive🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims
gits clean -v
HEAD is now at 803bc18 docs: Explain more about how to add and remove autocmds (#105)HEAD is now at 6c3bda4 chore(main): release 11.17.1 (#1927)HEAD is now at 3ec3e97 Support opening GitHub URLs via WSL (#75)🧹 LazyVim: cleaned successfully🧹 fzf: cleaned successfully🧹 lazy.nvim: cleaned successfullyHEAD is now at a13eb03 Add wiki.fzfHEAD is now at 8813180 Merge pull request #289 from JaKooLit/development🧹 everything: cleaned successfullyHEAD is now at ee8eb7a Update README.de.md🧹 Arch: cleaned successfully🧹 Dots: cleaned successfullyHEAD is now at c7f38e3bc8 fix(api): nvim_parse_cmd parses :map incorrectly #34068HEAD is now at 3f1dd2d fix(renderer): fix cut & paste stack overflow on hidden root (#1792)HEAD is now at 4a745ea Remove antiquated `a` mapHEAD is now at b4da76b fix(lsp): stop using deprecated `client.supports_method` function (#3468)🧹 fugitive: cleaned successfully🧹 neo-tree: cleaned successfully🧹 telescope: cleaned successfullyHEAD is now at ef3e4db Add hyprland and bspwm.HEAD is now at 806d8f6 Update repository locations.HEAD is now at c6d4631 Add installation done message.🧹 neovim: cleaned successfully🧹 archlinux: cleaned successfully🧹 nvims: cleaned successfully🧹 gits: cleaned successfullyHEAD is now at 4b4f18b1 merge: fix test-tkz-euclide.vimRemoving new-file🧹 vimtex: cleaned successfully
gits clean -v -r traap -n
🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims

Doctor

Doctor does not support dryrun or verbose.

gits doctor
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ None ✅ Repos: 14 ✅ Alias: LazyVim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: lazy.nvim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: neovim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: fzf 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: everything 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: Dots 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: Arch 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: neo-tree 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: telescope 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: fugitive 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.
gits doctor -r traap
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ traap ✅ Repos: 4 ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.

🛠️ Development Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

🧪 Delete

Delete will remove all repos within a group and the group itself unless 1) a repo is marked do_not_delete or repo untracked. Untracked repos are not listed in repository_locations.yml.

gits delete
🗂️ editor ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ Deleted: fzf 🗑️ Deleted: everything 🗑️ Deleted: fzf🗂️ hyprland 🗑️ Deleted: Dots 🗑️ Deleted: Arch 🗑️ Deleted: hyprland🗂️ plugins 🗑️ Deleted: neo-tree 🗑️ Deleted: telescope 🗑️ Deleted: fugitive 🗑️ Deleted: plugins🗂️ traap ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -n
🗂️ editor 🗑️ (dry-run) would remove: LazyVim -> /home/traap/editor/LazyVim 🗑️ (dry-run) would remove: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ (dry-run) would remove: neovim -> /home/traap/editor/neovim ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ (dry-run) would remove: fzf -> /home/traap/fzf/fzf 🗑️ (dry-run) would remove: everything -> /home/traap/fzf/everything ⚠️ Not Empty: fzf -> /home/traap/fzf🗂️ hyprland 🗑️ (dry-run) would remove: Dots -> /home/traap/hyprland/Dots 🗑️ (dry-run) would remove: Arch -> /home/traap/hyprland/Arch ⚠️ Not Empty: hyprland -> /home/traap/hyprland🗂️ plugins 🗑️ (dry-run) would remove: neo-tree -> /home/traap/plugins/neo-tree 🗑️ (dry-run) would remove: telescope -> /home/traap/plugins/telescope 🗑️ (dry-run) would remove: fugitive -> /home/traap/plugins/fugitive ⚠️ Not Empty: plugins -> /home/traap/plugins🗂️ traap 🗑️ (dry-run) would remove: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ (dry-run) would remove: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap 🧠 No repositories deleted.
gits delete -v -r traap
🗂️ traap 🗑️ Deleted: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ Deleted: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -r editor
🗂️ editor 🗑️ Deleted: LazyVim -> /home/traap/editor/LazyVim 🗑️ Deleted: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ Deleted: neovim -> /home/traap/editor/neovim 🗑️ Deleted: editor -> /home/traap/editor

🛠️ Development

Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

About

Sync git-based repositories.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gits is a Git repository group manager. It helps you efficiently clone, pull, clean, convert, delete, and track the status of many repositories—organized by group—using a single YAML configuration file.


📦 Features

  • Define repositories in logical groups
  • Use alias, target_path, and do_not_delete for fine-grained control
  • CLI powered by Typer
  • Fast installs and dependency management via uv
  • Supports dry-run and verbose modes
  • Works seamlessly on Arch Linux and Ubuntu

🚀 Installation

Installs gits to ~/.gits and links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/install.sh)"

This will:

Install uv if missing

Clone this repo into ~/.gits

Create a .venv and install dependencies

Symlink the CLI to ~/.local/bin/gits

Copy a default repository_locations.yml if one doesn't already exist

Ensure ~/.local/bin is in your PATH:``

🧹 Uninstall

To remove everything installed by gits:

Removes gits from ~/.gits and removes links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/uninstall.sh)"

This will:

Remove the ~/.gits directory

Remove the CLI symlink from ~/.local/bin/gits

🧾 Default repository_locations.yml

editor:
- root_dir: ~/editor
- repositories:
- alias: LazyVimurl: https://github.com/LazyVim/starter
- alias: lazy.nvimurl: https://github.com/folke/lazy.nvim
- alias: neovimurl: https://github.com/neovim/neovimfzf:
- root_dir: ~/fzf
- repositories:
- alias: fzfurl: https://github.com/junegunn/fzf-git.sh
- alias: everythingurl: https://github.com/junegunn/everything.fzfhyprland:
- root_dir: ~/hyprland
- repositories:
- alias: Dotsurl: https://github.com/JaKooLit/Hyprland-Dots
- alias: Archurl: https://github.com/JaKooLit/Arch-Hyprlandplugins:
- root_dir: ~/plugins
- repositories:
- alias: neo-treeurl: https://github.com/nvim-neo-tree/neo-tree.nvim
- alias: telescopeurl: https://github.com/nvim-telescope/telescope.nvim
- alias: fugitiveurl: https://github.com/tpope/vim-fugitivetraap:
- root_dir: ~/traap
- repositories:
- alias: archlinuxurl: git@github.com:Traap/bootstrap-archlinux
- alias: gitsurl: git@github.com:Traap/gitsdo_not_delete: true
- alias: nvimsurl: git@github.com:Traap/nvimsdo_not_delete: true
- alias: vimtexurl: https://github.com/lervag/vimtexdo_not_delete: false

🧠 Usage

🧪 Help

gits --help
 Usage: gits [OPTIONS] COMMAND [ARGS]... Manage git repositories defined in YAML configuration.╭─ Options ────────────────────────────────────────────────────────────────────╮│ --repo-group -r TEXT [default: None] ││ --verbose -v ││ --dry-run -n ││ --install-completion Install completion for the current ││ shell. ││ --show-completion Show completion for the current shell, ││ to copy it or customize the ││ installation. ││ --help Show this message and exit. │╰──────────────────────────────────────────────────────────────────────────────╯╭─ Commands ───────────────────────────────────────────────────────────────────╮│ clean Clean listed repositories by resetting and removing untracked ││ files, including subfolders. ││ clone Clone repositories listed in the YAML file. ││ convert Convert UTF-16 files to UTF-8 in all repositories. ││ doctor Run environment and configuration checks for gits. ││ delete Delete repositories listed in YAML that are not protected by ││ do_not_delete. ││ list List repository groups and optionally their repositories. ││ pull Pull changes for all repositories including unlisted ones. ││ status Print git status for all repositories. │╰──────────────────────────────────────────────────────────────────────────────╯

🧪 List

gits List
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap
gits list -v
🗂️ editor 🗃️ LazyVim 🗃️ lazy.nvim 🗃️ neovim🗂️ fzf 🗃️ fzf 🗃️ everything🗂️ hyprland 🗃️ Dots 🗃️ Arch🗂️ plugins 🗃️ neo-tree 🗃️ telescope 🗃️ fugitive🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex
gits list -v -r traap
🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex

🧪 Clone

Clone runs 4 jobs concurrently so console output is interwoven.

gits clone
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap 📥 Cloned: fzf 📥 Cloned: LazyVim 📥 Cloned: lazy.nvim 📥 Cloned: everything 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: nvims 📥 Cloned: vimtex 📥 Cloned: Arch 📥 Cloned: neovim 📥 Cloned: Dots
gits clone -v -n
🗂️ editor 📥 (dry-run) clone https://github.com/LazyVim/starter /home/traap/editor/LazyVim 📥 (dry-run) clone https://github.com/folke/lazy.nvim /home/traap/editor/lazy.nvim🗂️ fzf 📥 (dry-run) clone https://github.com/junegunn/everything.fzf /home/traap/fzf/everything 📥 (dry-run) clone https://github.com/junegunn/fzf-git.sh /home/traap/fzf/fzf🗂️ hyprland 📥 (dry-run) clone https://github.com/neovim/neovim /home/traap/editor/neovim 📥 (dry-run) clone https://github.com/JaKooLit/Arch-Hyprland /home/traap/hyprland/Arch 📥 (dry-run) clone https://github.com/JaKooLit/Hyprland-Dots /home/traap/hyprland/Dots🗂️ plugins 📥 (dry-run) clone https://github.com/nvim-telescope/telescope.nvim /home/traap/plugins/telescope 📥 (dry-run) clone https://github.com/nvim-neo-tree/neo-tree.nvim /home/traap/plugins/neo-tree 📥 (dry-run) clone https://github.com/tpope/vim-fugitive /home/traap/plugins/fugitive🗂️ traap ⚠️ Exists: archlinux ⚠️ Exists: gits ⚠️ Exists: nvims ⚠️ Exists: vimtex
gits clone -v -r traap
🗂️ traapCloning into '/home/traap/traap/archlinux'...Cloning into '/home/traap/traap/gits'...Cloning into '/home/traap/traap/nvims'...Cloning into '/home/traap/traap/vimtex'...POST git-upload-pack (181 bytes)POST git-upload-pack (gzip 1623 to 846 bytes) 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: vimtex 📥 Cloned: nvims

🧪 Status

gits status

No output when there are not any errors.

gits status -v
🗂️ editor 🧹 Clean: LazyVim 🧹 Clean: lazy.nvim 🧹 Clean: neovim🗂️ fzf 🧹 Clean: fzf 🧹 Clean: everything🗂️ hyprland 🧹 Clean: Dots 🧹 Clean: Arch🗂️ plugins 🧹 Clean: neo-tree 🧹 Clean: telescope 🧹 Clean: fugitive🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧹 Clean: vimtex
gits status -v -r traap
🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧠 Modified: vimtex M README.md	?? new-file stash@{0}: On master: gits status demo

🧪 Clean

gits clean -n
🧹 (dry-run) would clean LazyVim at /home/traap/editor/LazyVim🧹 (dry-run) would clean lazy.nvim at /home/traap/editor/lazy.nvim🧹 (dry-run) would clean neovim at /home/traap/editor/neovim🧹 (dry-run) would clean everything at /home/traap/fzf/everything🧹 (dry-run) would clean fzf at /home/traap/fzf/fzf🧹 (dry-run) would clean Dots at /home/traap/hyprland/Dots🧹 (dry-run) would clean Arch at /home/traap/hyprland/Arch🧹 (dry-run) would clean telescope at /home/traap/plugins/telescope🧹 (dry-run) would clean neo-tree at /home/traap/plugins/neo-tree🧹 (dry-run) would clean fugitive at /home/traap/plugins/fugitive🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims
gits clean -v
HEAD is now at 803bc18 docs: Explain more about how to add and remove autocmds (#105)HEAD is now at 6c3bda4 chore(main): release 11.17.1 (#1927)HEAD is now at 3ec3e97 Support opening GitHub URLs via WSL (#75)🧹 LazyVim: cleaned successfully🧹 fzf: cleaned successfully🧹 lazy.nvim: cleaned successfullyHEAD is now at a13eb03 Add wiki.fzfHEAD is now at 8813180 Merge pull request #289 from JaKooLit/development🧹 everything: cleaned successfullyHEAD is now at ee8eb7a Update README.de.md🧹 Arch: cleaned successfully🧹 Dots: cleaned successfullyHEAD is now at c7f38e3bc8 fix(api): nvim_parse_cmd parses :map incorrectly #34068HEAD is now at 3f1dd2d fix(renderer): fix cut & paste stack overflow on hidden root (#1792)HEAD is now at 4a745ea Remove antiquated `a` mapHEAD is now at b4da76b fix(lsp): stop using deprecated `client.supports_method` function (#3468)🧹 fugitive: cleaned successfully🧹 neo-tree: cleaned successfully🧹 telescope: cleaned successfullyHEAD is now at ef3e4db Add hyprland and bspwm.HEAD is now at 806d8f6 Update repository locations.HEAD is now at c6d4631 Add installation done message.🧹 neovim: cleaned successfully🧹 archlinux: cleaned successfully🧹 nvims: cleaned successfully🧹 gits: cleaned successfullyHEAD is now at 4b4f18b1 merge: fix test-tkz-euclide.vimRemoving new-file🧹 vimtex: cleaned successfully
gits clean -v -r traap -n
🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims

Doctor

Doctor does not support dryrun or verbose.

gits doctor
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ None ✅ Repos: 14 ✅ Alias: LazyVim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: lazy.nvim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: neovim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: fzf 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: everything 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: Dots 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: Arch 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: neo-tree 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: telescope 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: fugitive 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.
gits doctor -r traap
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ traap ✅ Repos: 4 ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.

🛠️ Development Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

🧪 Delete

Delete will remove all repos within a group and the group itself unless 1) a repo is marked do_not_delete or repo untracked. Untracked repos are not listed in repository_locations.yml.

gits delete
🗂️ editor ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ Deleted: fzf 🗑️ Deleted: everything 🗑️ Deleted: fzf🗂️ hyprland 🗑️ Deleted: Dots 🗑️ Deleted: Arch 🗑️ Deleted: hyprland🗂️ plugins 🗑️ Deleted: neo-tree 🗑️ Deleted: telescope 🗑️ Deleted: fugitive 🗑️ Deleted: plugins🗂️ traap ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -n
🗂️ editor 🗑️ (dry-run) would remove: LazyVim -> /home/traap/editor/LazyVim 🗑️ (dry-run) would remove: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ (dry-run) would remove: neovim -> /home/traap/editor/neovim ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ (dry-run) would remove: fzf -> /home/traap/fzf/fzf 🗑️ (dry-run) would remove: everything -> /home/traap/fzf/everything ⚠️ Not Empty: fzf -> /home/traap/fzf🗂️ hyprland 🗑️ (dry-run) would remove: Dots -> /home/traap/hyprland/Dots 🗑️ (dry-run) would remove: Arch -> /home/traap/hyprland/Arch ⚠️ Not Empty: hyprland -> /home/traap/hyprland🗂️ plugins 🗑️ (dry-run) would remove: neo-tree -> /home/traap/plugins/neo-tree 🗑️ (dry-run) would remove: telescope -> /home/traap/plugins/telescope 🗑️ (dry-run) would remove: fugitive -> /home/traap/plugins/fugitive ⚠️ Not Empty: plugins -> /home/traap/plugins🗂️ traap 🗑️ (dry-run) would remove: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ (dry-run) would remove: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap 🧠 No repositories deleted.
gits delete -v -r traap
🗂️ traap 🗑️ Deleted: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ Deleted: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -r editor
🗂️ editor 🗑️ Deleted: LazyVim -> /home/traap/editor/LazyVim 🗑️ Deleted: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ Deleted: neovim -> /home/traap/editor/neovim 🗑️ Deleted: editor -> /home/traap/editor

🛠️ Development

Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

About

Sync git-based repositories.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gits is a Git repository group manager. It helps you efficiently clone, pull, clean, convert, delete, and track the status of many repositories—organized by group—using a single YAML configuration file.


📦 Features

  • Define repositories in logical groups
  • Use alias, target_path, and do_not_delete for fine-grained control
  • CLI powered by Typer
  • Fast installs and dependency management via uv
  • Supports dry-run and verbose modes
  • Works seamlessly on Arch Linux and Ubuntu

🚀 Installation

Installs gits to ~/.gits and links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/install.sh)"

This will:

Install uv if missing

Clone this repo into ~/.gits

Create a .venv and install dependencies

Symlink the CLI to ~/.local/bin/gits

Copy a default repository_locations.yml if one doesn't already exist

Ensure ~/.local/bin is in your PATH:``

🧹 Uninstall

To remove everything installed by gits:

Removes gits from ~/.gits and removes links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/uninstall.sh)"

This will:

Remove the ~/.gits directory

Remove the CLI symlink from ~/.local/bin/gits

🧾 Default repository_locations.yml

editor:
- root_dir: ~/editor
- repositories:
- alias: LazyVimurl: https://github.com/LazyVim/starter
- alias: lazy.nvimurl: https://github.com/folke/lazy.nvim
- alias: neovimurl: https://github.com/neovim/neovimfzf:
- root_dir: ~/fzf
- repositories:
- alias: fzfurl: https://github.com/junegunn/fzf-git.sh
- alias: everythingurl: https://github.com/junegunn/everything.fzfhyprland:
- root_dir: ~/hyprland
- repositories:
- alias: Dotsurl: https://github.com/JaKooLit/Hyprland-Dots
- alias: Archurl: https://github.com/JaKooLit/Arch-Hyprlandplugins:
- root_dir: ~/plugins
- repositories:
- alias: neo-treeurl: https://github.com/nvim-neo-tree/neo-tree.nvim
- alias: telescopeurl: https://github.com/nvim-telescope/telescope.nvim
- alias: fugitiveurl: https://github.com/tpope/vim-fugitivetraap:
- root_dir: ~/traap
- repositories:
- alias: archlinuxurl: git@github.com:Traap/bootstrap-archlinux
- alias: gitsurl: git@github.com:Traap/gitsdo_not_delete: true
- alias: nvimsurl: git@github.com:Traap/nvimsdo_not_delete: true
- alias: vimtexurl: https://github.com/lervag/vimtexdo_not_delete: false

🧠 Usage

🧪 Help

gits --help
 Usage: gits [OPTIONS] COMMAND [ARGS]... Manage git repositories defined in YAML configuration.╭─ Options ────────────────────────────────────────────────────────────────────╮│ --repo-group -r TEXT [default: None] ││ --verbose -v ││ --dry-run -n ││ --install-completion Install completion for the current ││ shell. ││ --show-completion Show completion for the current shell, ││ to copy it or customize the ││ installation. ││ --help Show this message and exit. │╰──────────────────────────────────────────────────────────────────────────────╯╭─ Commands ───────────────────────────────────────────────────────────────────╮│ clean Clean listed repositories by resetting and removing untracked ││ files, including subfolders. ││ clone Clone repositories listed in the YAML file. ││ convert Convert UTF-16 files to UTF-8 in all repositories. ││ doctor Run environment and configuration checks for gits. ││ delete Delete repositories listed in YAML that are not protected by ││ do_not_delete. ││ list List repository groups and optionally their repositories. ││ pull Pull changes for all repositories including unlisted ones. ││ status Print git status for all repositories. │╰──────────────────────────────────────────────────────────────────────────────╯

🧪 List

gits List
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap
gits list -v
🗂️ editor 🗃️ LazyVim 🗃️ lazy.nvim 🗃️ neovim🗂️ fzf 🗃️ fzf 🗃️ everything🗂️ hyprland 🗃️ Dots 🗃️ Arch🗂️ plugins 🗃️ neo-tree 🗃️ telescope 🗃️ fugitive🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex
gits list -v -r traap
🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex

🧪 Clone

Clone runs 4 jobs concurrently so console output is interwoven.

gits clone
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap 📥 Cloned: fzf 📥 Cloned: LazyVim 📥 Cloned: lazy.nvim 📥 Cloned: everything 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: nvims 📥 Cloned: vimtex 📥 Cloned: Arch 📥 Cloned: neovim 📥 Cloned: Dots
gits clone -v -n
🗂️ editor 📥 (dry-run) clone https://github.com/LazyVim/starter /home/traap/editor/LazyVim 📥 (dry-run) clone https://github.com/folke/lazy.nvim /home/traap/editor/lazy.nvim🗂️ fzf 📥 (dry-run) clone https://github.com/junegunn/everything.fzf /home/traap/fzf/everything 📥 (dry-run) clone https://github.com/junegunn/fzf-git.sh /home/traap/fzf/fzf🗂️ hyprland 📥 (dry-run) clone https://github.com/neovim/neovim /home/traap/editor/neovim 📥 (dry-run) clone https://github.com/JaKooLit/Arch-Hyprland /home/traap/hyprland/Arch 📥 (dry-run) clone https://github.com/JaKooLit/Hyprland-Dots /home/traap/hyprland/Dots🗂️ plugins 📥 (dry-run) clone https://github.com/nvim-telescope/telescope.nvim /home/traap/plugins/telescope 📥 (dry-run) clone https://github.com/nvim-neo-tree/neo-tree.nvim /home/traap/plugins/neo-tree 📥 (dry-run) clone https://github.com/tpope/vim-fugitive /home/traap/plugins/fugitive🗂️ traap ⚠️ Exists: archlinux ⚠️ Exists: gits ⚠️ Exists: nvims ⚠️ Exists: vimtex
gits clone -v -r traap
🗂️ traapCloning into '/home/traap/traap/archlinux'...Cloning into '/home/traap/traap/gits'...Cloning into '/home/traap/traap/nvims'...Cloning into '/home/traap/traap/vimtex'...POST git-upload-pack (181 bytes)POST git-upload-pack (gzip 1623 to 846 bytes) 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: vimtex 📥 Cloned: nvims

🧪 Status

gits status

No output when there are not any errors.

gits status -v
🗂️ editor 🧹 Clean: LazyVim 🧹 Clean: lazy.nvim 🧹 Clean: neovim🗂️ fzf 🧹 Clean: fzf 🧹 Clean: everything🗂️ hyprland 🧹 Clean: Dots 🧹 Clean: Arch🗂️ plugins 🧹 Clean: neo-tree 🧹 Clean: telescope 🧹 Clean: fugitive🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧹 Clean: vimtex
gits status -v -r traap
🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧠 Modified: vimtex M README.md	?? new-file stash@{0}: On master: gits status demo

🧪 Clean

gits clean -n
🧹 (dry-run) would clean LazyVim at /home/traap/editor/LazyVim🧹 (dry-run) would clean lazy.nvim at /home/traap/editor/lazy.nvim🧹 (dry-run) would clean neovim at /home/traap/editor/neovim🧹 (dry-run) would clean everything at /home/traap/fzf/everything🧹 (dry-run) would clean fzf at /home/traap/fzf/fzf🧹 (dry-run) would clean Dots at /home/traap/hyprland/Dots🧹 (dry-run) would clean Arch at /home/traap/hyprland/Arch🧹 (dry-run) would clean telescope at /home/traap/plugins/telescope🧹 (dry-run) would clean neo-tree at /home/traap/plugins/neo-tree🧹 (dry-run) would clean fugitive at /home/traap/plugins/fugitive🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims
gits clean -v
HEAD is now at 803bc18 docs: Explain more about how to add and remove autocmds (#105)HEAD is now at 6c3bda4 chore(main): release 11.17.1 (#1927)HEAD is now at 3ec3e97 Support opening GitHub URLs via WSL (#75)🧹 LazyVim: cleaned successfully🧹 fzf: cleaned successfully🧹 lazy.nvim: cleaned successfullyHEAD is now at a13eb03 Add wiki.fzfHEAD is now at 8813180 Merge pull request #289 from JaKooLit/development🧹 everything: cleaned successfullyHEAD is now at ee8eb7a Update README.de.md🧹 Arch: cleaned successfully🧹 Dots: cleaned successfullyHEAD is now at c7f38e3bc8 fix(api): nvim_parse_cmd parses :map incorrectly #34068HEAD is now at 3f1dd2d fix(renderer): fix cut & paste stack overflow on hidden root (#1792)HEAD is now at 4a745ea Remove antiquated `a` mapHEAD is now at b4da76b fix(lsp): stop using deprecated `client.supports_method` function (#3468)🧹 fugitive: cleaned successfully🧹 neo-tree: cleaned successfully🧹 telescope: cleaned successfullyHEAD is now at ef3e4db Add hyprland and bspwm.HEAD is now at 806d8f6 Update repository locations.HEAD is now at c6d4631 Add installation done message.🧹 neovim: cleaned successfully🧹 archlinux: cleaned successfully🧹 nvims: cleaned successfully🧹 gits: cleaned successfullyHEAD is now at 4b4f18b1 merge: fix test-tkz-euclide.vimRemoving new-file🧹 vimtex: cleaned successfully
gits clean -v -r traap -n
🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims

Doctor

Doctor does not support dryrun or verbose.

gits doctor
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ None ✅ Repos: 14 ✅ Alias: LazyVim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: lazy.nvim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: neovim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: fzf 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: everything 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: Dots 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: Arch 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: neo-tree 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: telescope 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: fugitive 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.
gits doctor -r traap
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ traap ✅ Repos: 4 ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.

🛠️ Development Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

🧪 Delete

Delete will remove all repos within a group and the group itself unless 1) a repo is marked do_not_delete or repo untracked. Untracked repos are not listed in repository_locations.yml.

gits delete
🗂️ editor ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ Deleted: fzf 🗑️ Deleted: everything 🗑️ Deleted: fzf🗂️ hyprland 🗑️ Deleted: Dots 🗑️ Deleted: Arch 🗑️ Deleted: hyprland🗂️ plugins 🗑️ Deleted: neo-tree 🗑️ Deleted: telescope 🗑️ Deleted: fugitive 🗑️ Deleted: plugins🗂️ traap ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -n
🗂️ editor 🗑️ (dry-run) would remove: LazyVim -> /home/traap/editor/LazyVim 🗑️ (dry-run) would remove: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ (dry-run) would remove: neovim -> /home/traap/editor/neovim ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ (dry-run) would remove: fzf -> /home/traap/fzf/fzf 🗑️ (dry-run) would remove: everything -> /home/traap/fzf/everything ⚠️ Not Empty: fzf -> /home/traap/fzf🗂️ hyprland 🗑️ (dry-run) would remove: Dots -> /home/traap/hyprland/Dots 🗑️ (dry-run) would remove: Arch -> /home/traap/hyprland/Arch ⚠️ Not Empty: hyprland -> /home/traap/hyprland🗂️ plugins 🗑️ (dry-run) would remove: neo-tree -> /home/traap/plugins/neo-tree 🗑️ (dry-run) would remove: telescope -> /home/traap/plugins/telescope 🗑️ (dry-run) would remove: fugitive -> /home/traap/plugins/fugitive ⚠️ Not Empty: plugins -> /home/traap/plugins🗂️ traap 🗑️ (dry-run) would remove: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ (dry-run) would remove: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap 🧠 No repositories deleted.
gits delete -v -r traap
🗂️ traap 🗑️ Deleted: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ Deleted: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -r editor
🗂️ editor 🗑️ Deleted: LazyVim -> /home/traap/editor/LazyVim 🗑️ Deleted: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ Deleted: neovim -> /home/traap/editor/neovim 🗑️ Deleted: editor -> /home/traap/editor

🛠️ Development

Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

About

Sync git-based repositories.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

gits is a Git repository group manager. It helps you efficiently clone, pull, clean, convert, delete, and track the status of many repositories—organized by group—using a single YAML configuration file.


📦 Features

  • Define repositories in logical groups
  • Use alias, target_path, and do_not_delete for fine-grained control
  • CLI powered by Typer
  • Fast installs and dependency management via uv
  • Supports dry-run and verbose modes
  • Works seamlessly on Arch Linux and Ubuntu

🚀 Installation

Installs gits to ~/.gits and links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/install.sh)"

This will:

Install uv if missing

Clone this repo into ~/.gits

Create a .venv and install dependencies

Symlink the CLI to ~/.local/bin/gits

Copy a default repository_locations.yml if one doesn't already exist

Ensure ~/.local/bin is in your PATH:``

🧹 Uninstall

To remove everything installed by gits:

Removes gits from ~/.gits and removes links the CLI to ~/.local/bin/gits.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Traap/gits/master/uninstall.sh)"

This will:

Remove the ~/.gits directory

Remove the CLI symlink from ~/.local/bin/gits

🧾 Default repository_locations.yml

editor:
- root_dir: ~/editor
- repositories:
- alias: LazyVimurl: https://github.com/LazyVim/starter
- alias: lazy.nvimurl: https://github.com/folke/lazy.nvim
- alias: neovimurl: https://github.com/neovim/neovimfzf:
- root_dir: ~/fzf
- repositories:
- alias: fzfurl: https://github.com/junegunn/fzf-git.sh
- alias: everythingurl: https://github.com/junegunn/everything.fzfhyprland:
- root_dir: ~/hyprland
- repositories:
- alias: Dotsurl: https://github.com/JaKooLit/Hyprland-Dots
- alias: Archurl: https://github.com/JaKooLit/Arch-Hyprlandplugins:
- root_dir: ~/plugins
- repositories:
- alias: neo-treeurl: https://github.com/nvim-neo-tree/neo-tree.nvim
- alias: telescopeurl: https://github.com/nvim-telescope/telescope.nvim
- alias: fugitiveurl: https://github.com/tpope/vim-fugitivetraap:
- root_dir: ~/traap
- repositories:
- alias: archlinuxurl: git@github.com:Traap/bootstrap-archlinux
- alias: gitsurl: git@github.com:Traap/gitsdo_not_delete: true
- alias: nvimsurl: git@github.com:Traap/nvimsdo_not_delete: true
- alias: vimtexurl: https://github.com/lervag/vimtexdo_not_delete: false

🧠 Usage

🧪 Help

gits --help
 Usage: gits [OPTIONS] COMMAND [ARGS]... Manage git repositories defined in YAML configuration.╭─ Options ────────────────────────────────────────────────────────────────────╮│ --repo-group -r TEXT [default: None] ││ --verbose -v ││ --dry-run -n ││ --install-completion Install completion for the current ││ shell. ││ --show-completion Show completion for the current shell, ││ to copy it or customize the ││ installation. ││ --help Show this message and exit. │╰──────────────────────────────────────────────────────────────────────────────╯╭─ Commands ───────────────────────────────────────────────────────────────────╮│ clean Clean listed repositories by resetting and removing untracked ││ files, including subfolders. ││ clone Clone repositories listed in the YAML file. ││ convert Convert UTF-16 files to UTF-8 in all repositories. ││ doctor Run environment and configuration checks for gits. ││ delete Delete repositories listed in YAML that are not protected by ││ do_not_delete. ││ list List repository groups and optionally their repositories. ││ pull Pull changes for all repositories including unlisted ones. ││ status Print git status for all repositories. │╰──────────────────────────────────────────────────────────────────────────────╯

🧪 List

gits List
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap
gits list -v
🗂️ editor 🗃️ LazyVim 🗃️ lazy.nvim 🗃️ neovim🗂️ fzf 🗃️ fzf 🗃️ everything🗂️ hyprland 🗃️ Dots 🗃️ Arch🗂️ plugins 🗃️ neo-tree 🗃️ telescope 🗃️ fugitive🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex
gits list -v -r traap
🗂️ traap 🗃️ archlinux 🗃️ gits 🗃️ nvims 🗃️ vimtex

🧪 Clone

Clone runs 4 jobs concurrently so console output is interwoven.

gits clone
🗂️ editor🗂️ fzf🗂️ hyprland🗂️ plugins🗂️ traap 📥 Cloned: fzf 📥 Cloned: LazyVim 📥 Cloned: lazy.nvim 📥 Cloned: everything 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: nvims 📥 Cloned: vimtex 📥 Cloned: Arch 📥 Cloned: neovim 📥 Cloned: Dots
gits clone -v -n
🗂️ editor 📥 (dry-run) clone https://github.com/LazyVim/starter /home/traap/editor/LazyVim 📥 (dry-run) clone https://github.com/folke/lazy.nvim /home/traap/editor/lazy.nvim🗂️ fzf 📥 (dry-run) clone https://github.com/junegunn/everything.fzf /home/traap/fzf/everything 📥 (dry-run) clone https://github.com/junegunn/fzf-git.sh /home/traap/fzf/fzf🗂️ hyprland 📥 (dry-run) clone https://github.com/neovim/neovim /home/traap/editor/neovim 📥 (dry-run) clone https://github.com/JaKooLit/Arch-Hyprland /home/traap/hyprland/Arch 📥 (dry-run) clone https://github.com/JaKooLit/Hyprland-Dots /home/traap/hyprland/Dots🗂️ plugins 📥 (dry-run) clone https://github.com/nvim-telescope/telescope.nvim /home/traap/plugins/telescope 📥 (dry-run) clone https://github.com/nvim-neo-tree/neo-tree.nvim /home/traap/plugins/neo-tree 📥 (dry-run) clone https://github.com/tpope/vim-fugitive /home/traap/plugins/fugitive🗂️ traap ⚠️ Exists: archlinux ⚠️ Exists: gits ⚠️ Exists: nvims ⚠️ Exists: vimtex
gits clone -v -r traap
🗂️ traapCloning into '/home/traap/traap/archlinux'...Cloning into '/home/traap/traap/gits'...Cloning into '/home/traap/traap/nvims'...Cloning into '/home/traap/traap/vimtex'...POST git-upload-pack (181 bytes)POST git-upload-pack (gzip 1623 to 846 bytes) 📥 Cloned: archlinux 📥 Cloned: gits 📥 Cloned: vimtex 📥 Cloned: nvims

🧪 Status

gits status

No output when there are not any errors.

gits status -v
🗂️ editor 🧹 Clean: LazyVim 🧹 Clean: lazy.nvim 🧹 Clean: neovim🗂️ fzf 🧹 Clean: fzf 🧹 Clean: everything🗂️ hyprland 🧹 Clean: Dots 🧹 Clean: Arch🗂️ plugins 🧹 Clean: neo-tree 🧹 Clean: telescope 🧹 Clean: fugitive🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧹 Clean: vimtex
gits status -v -r traap
🗂️ traap 🧹 Clean: archlinux 🧹 Clean: gits 🧹 Clean: nvims 🧠 Modified: vimtex M README.md	?? new-file stash@{0}: On master: gits status demo

🧪 Clean

gits clean -n
🧹 (dry-run) would clean LazyVim at /home/traap/editor/LazyVim🧹 (dry-run) would clean lazy.nvim at /home/traap/editor/lazy.nvim🧹 (dry-run) would clean neovim at /home/traap/editor/neovim🧹 (dry-run) would clean everything at /home/traap/fzf/everything🧹 (dry-run) would clean fzf at /home/traap/fzf/fzf🧹 (dry-run) would clean Dots at /home/traap/hyprland/Dots🧹 (dry-run) would clean Arch at /home/traap/hyprland/Arch🧹 (dry-run) would clean telescope at /home/traap/plugins/telescope🧹 (dry-run) would clean neo-tree at /home/traap/plugins/neo-tree🧹 (dry-run) would clean fugitive at /home/traap/plugins/fugitive🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims
gits clean -v
HEAD is now at 803bc18 docs: Explain more about how to add and remove autocmds (#105)HEAD is now at 6c3bda4 chore(main): release 11.17.1 (#1927)HEAD is now at 3ec3e97 Support opening GitHub URLs via WSL (#75)🧹 LazyVim: cleaned successfully🧹 fzf: cleaned successfully🧹 lazy.nvim: cleaned successfullyHEAD is now at a13eb03 Add wiki.fzfHEAD is now at 8813180 Merge pull request #289 from JaKooLit/development🧹 everything: cleaned successfullyHEAD is now at ee8eb7a Update README.de.md🧹 Arch: cleaned successfully🧹 Dots: cleaned successfullyHEAD is now at c7f38e3bc8 fix(api): nvim_parse_cmd parses :map incorrectly #34068HEAD is now at 3f1dd2d fix(renderer): fix cut & paste stack overflow on hidden root (#1792)HEAD is now at 4a745ea Remove antiquated `a` mapHEAD is now at b4da76b fix(lsp): stop using deprecated `client.supports_method` function (#3468)🧹 fugitive: cleaned successfully🧹 neo-tree: cleaned successfully🧹 telescope: cleaned successfullyHEAD is now at ef3e4db Add hyprland and bspwm.HEAD is now at 806d8f6 Update repository locations.HEAD is now at c6d4631 Add installation done message.🧹 neovim: cleaned successfully🧹 archlinux: cleaned successfully🧹 nvims: cleaned successfully🧹 gits: cleaned successfullyHEAD is now at 4b4f18b1 merge: fix test-tkz-euclide.vimRemoving new-file🧹 vimtex: cleaned successfully
gits clean -v -r traap -n
🧹 (dry-run) would clean archlinux at /home/traap/traap/archlinux🧹 (dry-run) would clean gits at /home/traap/traap/gits🧹 (dry-run) would clean vimtex at /home/traap/traap/vimtex🧹 (dry-run) would clean nvims at /home/traap/traap/nvims

Doctor

Doctor does not support dryrun or verbose.

gits doctor
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ None ✅ Repos: 14 ✅ Alias: LazyVim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: lazy.nvim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: neovim 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/editor ✅ Alias: fzf 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: everything 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/fzf ✅ Alias: Dots 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: Arch 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/hyprland ✅ Alias: neo-tree 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: telescope 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: fugitive 🧠 Target_path: True ⚠️ path: not found ⚠️ Not Found: /home/traap/plugins ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.
gits doctor -r traap
🧪 Running system diagnostics. ✅ Python >= 3.8: 3.13.3 ✅ git found in PATH ✅ /home/traap/.config/gits/repository_locations.yml found🗂️ traap ✅ Repos: 4 ✅ Alias: archlinux 🧠 Target_path: True 🧠 path: /home/traap/traap/archlinux 🧠 Found: /home/traap/traap ✅ Alias: gits 🧠 Target_path: True 🧠 path: /home/traap/traap/gits 🧠 Found: /home/traap/traap ✅ Alias: nvims 🧠 Target_path: True 🧠 path: /home/traap/traap/nvims 🧠 Found: /home/traap/traap ✅ Alias: vimtex 🧠 Target_path: True 🧠 path: /home/traap/traap/vimtex 🧠 Found: /home/traap/traap🧪 Diagnostics complete.

🛠️ Development Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

🧪 Delete

Delete will remove all repos within a group and the group itself unless 1) a repo is marked do_not_delete or repo untracked. Untracked repos are not listed in repository_locations.yml.

gits delete
🗂️ editor ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ Deleted: fzf 🗑️ Deleted: everything 🗑️ Deleted: fzf🗂️ hyprland 🗑️ Deleted: Dots 🗑️ Deleted: Arch 🗑️ Deleted: hyprland🗂️ plugins 🗑️ Deleted: neo-tree 🗑️ Deleted: telescope 🗑️ Deleted: fugitive 🗑️ Deleted: plugins🗂️ traap ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -n
🗂️ editor 🗑️ (dry-run) would remove: LazyVim -> /home/traap/editor/LazyVim 🗑️ (dry-run) would remove: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ (dry-run) would remove: neovim -> /home/traap/editor/neovim ⚠️ Not Empty: editor -> /home/traap/editor🗂️ fzf 🗑️ (dry-run) would remove: fzf -> /home/traap/fzf/fzf 🗑️ (dry-run) would remove: everything -> /home/traap/fzf/everything ⚠️ Not Empty: fzf -> /home/traap/fzf🗂️ hyprland 🗑️ (dry-run) would remove: Dots -> /home/traap/hyprland/Dots 🗑️ (dry-run) would remove: Arch -> /home/traap/hyprland/Arch ⚠️ Not Empty: hyprland -> /home/traap/hyprland🗂️ plugins 🗑️ (dry-run) would remove: neo-tree -> /home/traap/plugins/neo-tree 🗑️ (dry-run) would remove: telescope -> /home/traap/plugins/telescope 🗑️ (dry-run) would remove: fugitive -> /home/traap/plugins/fugitive ⚠️ Not Empty: plugins -> /home/traap/plugins🗂️ traap 🗑️ (dry-run) would remove: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ (dry-run) would remove: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap 🧠 No repositories deleted.
gits delete -v -r traap
🗂️ traap 🗑️ Deleted: archlinux -> /home/traap/traap/archlinux 🧠 Skipped gits (do_not_delete = true) 🧠 Skipped nvims (do_not_delete = true) 🗑️ Deleted: vimtex -> /home/traap/traap/vimtex ⚠️ Not Empty: traap -> /home/traap/traap
gits delete -v -r editor
🗂️ editor 🗑️ Deleted: LazyVim -> /home/traap/editor/LazyVim 🗑️ Deleted: lazy.nvim -> /home/traap/editor/lazy.nvim 🗑️ Deleted: neovim -> /home/traap/editor/neovim 🗑️ Deleted: editor -> /home/traap/editor

🛠️ Development

Clone and test locally:

git clone https://github.com/Traap/gits ~/.gits
cd~/.gits
uv venv .venv
source .venv/bin/activate
uv pip install -e .
gits --help

About

Sync git-based repositories.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages