Skip to main content

Organize git repositories by their origin URL

Project description

reposort v2.1.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.
  sort   Sort existing repositories by their origin URL.

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.

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-2.1.0.tar.gz (27.8 kB view details)

Uploaded Source

Built Distribution

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

reposort-2.1.0-py3-none-any.whl (7.6 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for reposort-2.1.0.tar.gz
Algorithm Hash digest
SHA256 8671dbb57659b25b400ee8e51b3f19ab11caf12e477e77805d86ac9e98fb4b5f
MD5 85bb0309ebfc6ce448dc5772b8ce6647
BLAKE2b-256 b23cee6c1154d0fd058c98776b70e698f75df24f94685266db46cb9ea7f564bd

See more details on using hashes here.

Provenance

The following attestation bundles were made for reposort-2.1.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-2.1.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for reposort-2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 851e673b5e0ca868d22e72e0e70e54b0f8d4ef0ae4bbd5add5e47aa7d4a6b192
MD5 965901675cfe0e23eb9b7e836375c5bc
BLAKE2b-256 b714788da95c2d2597a3294a777476c57431ca2806bfd502a43f243298e9a495

See more details on using hashes here.

Provenance

The following attestation bundles were made for reposort-2.1.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