Skip to main content

Organize git repositories by their origin URL

Project description

reposort v3.0.0

Organize git repositories by their origin URL.

Why?

If you work with many git repositories, you've probably inflicted these problems on yourself:

  • Scattered repositories: Repos cloned into random directories (~/workspace, ~/stufs, ~/tmp/test123)
  • Hard to find projects: No consistent structure makes it difficult to locate specific repositories
  • Duplicate clones: Multiple copies of the same repo in different locations
  • Mixed sources: Repos from GitHub, GitLab, BitBucket, and private servers all jumbled together
  • Lost context: Directory names don't reflect the organization or team that owns the repo

reposort fixes your shit by automatically organizing all your git repositories based on their remote origin URL, creating a predictable, hierarchical structure that mirrors the source hosting:

~/code/
├── aur.archlinux.org/
│   └── weewx/
├── bitbucket.org/
│   ├── bhptechsi/
│   └── ccgmurdoch/
├── github.com/
│   ├── apple/
│   ├── astar-ai/
│   ├── ...
│   ├── sthysel/
│   ├── sthysel-freight/
│   ├── sthyselfreight/
│   ├── sthysel-shop/
│   ├── sthyselzsh/
│   └── windwp/
├── gitlab.com/
│   ├── bhp-cloudfactory/
│   └── vasdee/
├── sdappsgit.bhp.com/
│   ├── iabs/
│   └── mag/
├── sdappsgit.ent.bhpbilliton.net/
│   ├── ddl/
│   ├── hdl/
│   ├── ...
│   ├── scm/
│   ├── toc/
│   └── wts/
└── ssh.dev.azure.com/
    └── v3/

This structure makes it easy to:

  • Find a repository in context
  • Understand where a project comes from at a glance
  • Avoid duplicate clones
  • Navigate related projects from the same organization
  • Script operations across repositories by host or team

Tip: While this organization provides a clean canonical structure, you can maintain a "linkfarm" of symbolic links to frequently used repositories or project groups for quick access:

~/active/
├── current-project -> ~/code/github.com/mycompany/api
├── monitoring -> ~/code/github.com/mycompany/monitoring
└── dotfiles -> ~/code/github.com/me/dotfiles

This gives you both a well-organised source of truth and convenient shortcuts for active work.

Installation

For Users

reposort is in pypi, install as a tool using uv:

# Install globally as a tool
uv tool install reposort

# Or run directly without installation
uvx reposort --dry-run
$ reposort --help
Usage: reposort [OPTIONS] COMMAND [ARGS]...

  Organize git repositories by their origin URL.

Commands:
  clone  Clone a repository and organize it by its origin URL.
  list   List all repositories in a table view.
  sort   Sort existing repositories by their origin URL.
  tree   Display repositories in a tree view organized by host.

Options:
  --help  Show this message and exit.

Using uvx is convenient for one-off runs or trying the tool without installing it. The tool will be downloaded and cached automatically.

For Development

Clone the repository and install in editable mode:

uv sync

This will create a virtual environment, install the package in editable mode, and install all dependencies (including dev dependencies from the lockfile).

Usage

Sorting Existing Repositories

Organize existing git repositories on your filesystem:

# Dry-run to preview changes (default command)
reposort --dry-run
reposort sort --dry-run

# Execute the reorganization (default: searches current dir, targets ~/code)
reposort
reposort sort

# Custom source and target directories
reposort sort --source /path/to/repos --target ~/projects

Cloning New Repositories

Clone repositories directly into the organized structure:

# Clone to the organized location (dry-run first to see where it goes)
reposort clone https://github.com/user/repo.git --dry-run

# Actually clone the repository
reposort clone https://github.com/user/repo.git

# Clone with SSH URL
reposort clone git@github.com:user/repo.git

# Clone to a custom target directory
reposort clone git@github.com:user/repo.git --target ~/projects

This automatically clones to ~/code/github.com/user/repo (or your custom target), maintaining the same organizational structure as the sort command.

Viewing Repositories

View your organized repositories with the list and tree commands:

# Table view with host, path, branch, status, and remote URL
reposort list

# Tree view organized by host
reposort tree

# View repositories in a custom directory
reposort list --target ~/projects
reposort tree --target ~/projects

Table view (list) shows a detailed table with columns for host, path, branch, status (clean/dirty), and remote URL:

┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Host         ┃ Path           ┃ Branch ┃ Status ┃ Remote URL                ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ github.com   │ sthysel/repo   │ main   │ clean  │ git@github.com:sthysel/…  │
│ github.com   │ other/project  │ develop│ dirty  │ git@github.com:other/pr…  │
│ gitlab.com   │ team/service   │ main   │ clean  │ git@gitlab.com:team/ser…  │
└──────────────┴────────────────┴────────┴────────┴───────────────────────────┘

Tree view (tree) shows a hierarchical view organized by host and owner:

~/code/
├── github.com/
│   ├── sthysel/
│   │   ├── reposort (main, clean)
│   │   └── dotfiles (master, dirty)
│   └── other/
│       └── project (develop, clean)
└── gitlab.com/
    └── team/
        └── service (main, clean)

Examples

Sorting Existing Repos

Move scattered repositories into organized structure:

# Before: repos scattered everywhere
~/workspace/my-project/
~/Downloads/temp-repo/
~/code/random-clone/

# Run reposort
reposort

# After: organized by origin URL
~/code/github.com/user/my-project/
~/code/github.com/user/temp-repo/
~/code/gitlab.com/team/random-clone/

Cloning New Repos

Clone directly into organized structure:

# Traditional approach
git clone git@github.com:user/repo.git
cd repo

# With reposort - automatically organized!
reposort clone git@github.com:user/repo.git
cd ~/code/github.com/user/repo

URL Transformations

Both commands handle various git URL formats:

  • git@github.com:user/repo.git~/code/github.com/user/repo
  • ssh://git@host:7999/team/project.git~/code/host/team/project
  • https://github.com/user/repo.git~/code/github.com/user/repo

Development

Quick Start with just

This project includes a justfile for common development tasks:

# Set up dev environment (install deps + pre-commit hooks)
just setup

# Run type checking
just typecheck

# Run linting
just lint

# Auto-fix linting issues
just fix

# Format code
just format

# Run all checks
just check

# Run pre-commit hooks on all files
just pre-commit

# Clean build artifacts
just clean

# See all available commands
just --list

Manual Commands

Install dependencies:

uv sync

Set up pre-commit hooks:

pre-commit install

Run type checking:

ty check src/reposort

Run formatting and linting:

ruff check src/reposort
ruff format src/reposort

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

reposort-3.0.0.tar.gz (29.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

reposort-3.0.0-py3-none-any.whl (9.4 kB view details)

Uploaded Python 3

File details

Details for the file reposort-3.0.0.tar.gz.

File metadata

  • Download URL: reposort-3.0.0.tar.gz
  • Upload date:
  • Size: 29.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for reposort-3.0.0.tar.gz
Algorithm Hash digest
SHA256 6311bde7da7c8e0a5f45e4a58fd798df099d54cd5081db5ac1d0466841c31c5d
MD5 d422ea90297b395b429aaf54cc24de01
BLAKE2b-256 a56dd61731b510cb4b33a305851a26e37ef2fcd566767e53008eb29a7b72f32b

See more details on using hashes here.

Provenance

The following attestation bundles were made for reposort-3.0.0.tar.gz:

Publisher: publish.yml on sthysel/reposort

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file reposort-3.0.0-py3-none-any.whl.

File metadata

  • Download URL: reposort-3.0.0-py3-none-any.whl
  • Upload date:
  • Size: 9.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for reposort-3.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b91a4ed335a3c146db8afda05ef94cb0b8a57796e7b8cea795c7aa3382cb6a5f
MD5 392e8953c156f4218c5b765624eeec3c
BLAKE2b-256 3ee7e5c138726c679d99726cf9a143e72254965c318827f083110233d8ce7022

See more details on using hashes here.

Provenance

The following attestation bundles were made for reposort-3.0.0-py3-none-any.whl:

Publisher: publish.yml on sthysel/reposort

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page