git-get

A tool to clone, organize, and manage multiple Git repositories with an automatic directory structure based on repository URLs.
Table of Contents
Overview
git-get solves the problem of manually organizing multiple Git repositories. Instead of scattered clones in random directories, it creates a clean, predictable directory structure based on repository URLs, similar to Go's go get command.
It provides two commands through a single binary:
git get - Clones repositories into an organized directory tree
git list - Shows the status of all your repositories at a glance
Note: Both commands are provided by a single git-get binary that automatically detects how it was invoked (either directly or via symlink).

Features
- Automatic organization - Creates directory structure based on repository URL
- Git integration - Seamlessly integrates as native Git commands
- Multi-platform - Works on macOS, Linux, and Windows
- Repository discovery - Lists all repositories with their status
- Flexible configuration - Supports environment variables and Git config
- Multiple output formats - Tree, flat, and dump formats for different use cases
- Dotfiles friendly - Clone multiple repositories from a list kept in dotfiles
Prerequisites
- Git 2.0+ installed and configured
- Go 1.24+ (only if building from source)
Installation
macOS
Option 1: Homebrew (Recommended)
brew install git-get
This automatically installs both git-get and git-list commands.
Option 2: Manual Installation
- Download the latest macOS
.tar.gz file from releases
- Extract and install:
tar -xzf git-get_*_darwin_*.tar.gz
sudo mv git-get /usr/local/bin/
sudo ln -sf /usr/local/bin/git-get /usr/local/bin/git-list
Linux
Option 1: Package Managers (Recommended)
# Ubuntu/Debian - Download and install .deb package
wget https://github.com/grdl/git-get/releases/latest/download/git-get_*_linux_amd64.deb
sudo dpkg -i git-get_*_linux_amd64.deb
# CentOS/RHEL/Fedora - Download and install .rpm package
wget https://github.com/grdl/git-get/releases/latest/download/git-get_*_linux_amd64.rpm
sudo rpm -i git-get_*_linux_amd64.rpm
Package installation automatically creates the git-list symlink.
Option 2: Manual Installation
# Download and extract
wget https://github.com/grdl/git-get/releases/latest/download/git-get_*_linux_amd64.tar.gz
tar -xzf git-get_*_linux_amd64.tar.gz
# Install binary and create symlink
sudo mv git-get /usr/local/bin/
sudo ln -sf /usr/local/bin/git-get /usr/local/bin/git-list
Option 3: Homebrew on Linux
brew install git-get
Windows
Option 1: Scoop (Recommended)
scoop bucket add grdl https://github.com/grdl/homebrew-tap
scoop install git-get
This automatically creates both git-get.exe and git-list.exe commands.
Option 2: Manual Installation
- Download the latest Windows
.zip file from releases
- Extract
git-get.exe to a directory in your PATH
- Create a copy or hard link for
git-list:
# In the same directory as git-get.exe
Copy-Item git-get.exe git-list.exe
# OR create a hard link (requires admin privileges)
New-Item -ItemType HardLink -Path "git-list.exe" -Target "git-get.exe"
Building from Source
git clone https://github.com/grdl/git-get.git
cd git-get
go build -o git-get ./cmd/
# Create symlink for git-list
ln -sf git-get git-list # Unix/Linux/macOS
# OR
copy git-get.exe git-list.exe # Windows
Note: The single binary (git-get) automatically detects how it's invoked and behaves as either git-get or git-list accordingly.
Quick Start
- Install git-get using one of the methods above
- Clone your first repository:
git get github.com/grdl/git-get
- List your repositories:
git list
That's it! Your repository is now organized in ~/repositories/github.com/grdl/git-get/.
Usage
git get
Clone repositories with automatic directory structure:
git get [flags]
Flags:
-b, --branch - Branch or tag to checkout after cloning
-d, --dump - Clone multiple repositories from a dump file
-t, --host - Default host for short repository names (default: github.com)
-r, --root - Root directory for repositories (default: ~/repositories)
-c, --scheme - Default scheme for URLs (default: ssh)
-s, --skip-host - Skip creating host directory
-h, --help - Show help
-v, --version - Show version
Repository formats:
- Full URL:
https://github.com/user/repo.git
- SSH URL:
git@github.com:user/repo.git
- Short format:
user/repo (uses default host)
- GitHub format:
github.com/user/repo
git list
Display repository status with multiple output formats:
git list [flags]
Flags:
-f, --fetch - Fetch from remotes before listing
-o, --out - Output format: tree, flat, or dump (default: tree)
-r, --root - Root directory to scan (default: ~/repositories)
-h, --help - Show help
-v, --version - Show version
Output formats:
Tree format (default):

Flat format:

Dump format:

Batch Operations
Generate dump file from existing repositories:
git list --out dump > my-repos.txt
Clone all repositories from the dump file:
git get --dump repos.txt
Configuration
All configuration options that can be set via command-line flags, can also be set by environment variables, or Git configuration files.
Priority order (highest to lowest):
- Command-line flags
- Environment variables
- Git configuration file
- Default values
Environment Variables
Use the GITGET_ prefix with uppercase flag names:
export GITGET_ROOT=/workspace/repositories
export GITGET_HOST=gitlab.com
export GITGET_SKIP_HOST=true
Git Configuration
Add a [gitget] section to your global Git configuration:
git config --global gitget.root /workspace/repositories
git config --global gitget.host gitlab.com
git config --global gitget.skip-host true
Or edit ~/.gitconfig directly:
[gitget]
root = /workspace/repositories
host = gitlab.com
skip-host = true
Examples
Clone a repository:
git get facebook/react
# Clones to: ~/repositories/github.com/facebook/react/
Clone to custom location:
git get --root /workspace golang/go
# Clones to: /workspace/github.com/golang/go/
Clone specific branch:
git get --branch v1.19.0 golang/go
Skip host directory:
git get --skip-host facebook/react
# Clones to: ~/repositories/facebook/react/
List repositories with status:
git list --fetch
Generate backup list:
git list --out dump > backup-$(date +%Y%m%d).txt
Troubleshooting
Common Issues
Permission denied (SSH):
# Make sure SSH keys are configured
ssh-add -l
# Or use HTTPS instead
export GITGET_SCHEME=https
Repository not found:
# Check if repository URL is correct
git ls-remote https://github.com/user/repo.git
Path issues on Windows:
# Use forward slashes or double backslashes in paths
git get --root C:/workspace user/repo
Debug Mode
Enable verbose output:
# Set environment variable for debug logs
export GITGET_DEBUG=1
git get user/repo
Getting Help
- Check our Issues for known problems
- Create a new issue if you need help
- Include output from
git get --version and relevant error messages
Contributing
We welcome contributions!
Quick Start
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature
- Install dependencies:
go mod download
- Make changes and add tests
- Format:
go fmt ./...
- Build:
go build -o git-get ./cmd/
- Run tests:
go test ./...
- Run linter:
golangci-lint run
- Commit changes:
git commit -m 'Add amazing feature'
- Push to branch:
git push origin feature/amazing-feature
- Open a Pull Request
Testing
Run the test suite:
# Run all tests
go test ./...
# Run tests with coverage
go test -race -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
# Run specific package tests
go test -v ./pkg/git
Linting
# Install golangci-lint (if not already installed)
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
# Run linting with the project's configuration
golangci-lint run
# Run with verbose output
golangci-lint run -v
# Fix auto-fixable issues
golangci-lint run --fix
Releasing a New Version
For maintainers releasing a new version:
- Create and push a new git tag:
git tag v0.7.0
git push origin v0.7.0
-
GitHub Actions will automatically:
- Build binaries for all platforms
- Create a GitHub release with assets
- Update the Scoop package
-
Update Homebrew-core formula:
# Replace with your actual version
brew bump-formula-pr --tag=v0.7.0 git-get
This command automatically downloads the new release, calculates checksums, updates the formula, and creates a PR to homebrew-core.
Note: Since git-get is in homebrew-core, the community or Homebrew's automated systems may also update the formula when new releases are detected.
License
This project is licensed under the MIT License - see the LICENSE.md file for details.
Acknowledgments
Inspired by:
- Go's
go get command for its elegant repository organization
- ghq by x-motemen for repository management concepts
- multi-git-status by fboender for status display ideas
Built with: