#git-repository #git-clone #git #git-checkout #domain-name #tool

app git-grab

A tool to clone git repositories to a standard location, organised by domain name and path

7 releases (stable)

3.0.0 May 29, 2024
2.1.0 Mar 25, 2024
2.0.0 Dec 4, 2023
1.0.1 Jul 7, 2022
0.1.2 Jul 11, 2021

#53 in Development tools

MIT/Apache

27KB
600 lines

⤵️
Git Grab

A small tool to clone git repositories to a standard location, organised by domain name and path. It runs on BSD, Linux, macOS, Windows, and more.


Git Grab clones a repo into $GRAB_HOME, organised by domain and path. GRAB_HOME defaults to ~/src if not set or supplied via the --home argument. For example:

$ git grab github.com/wezm/git-grab
Cloning into '/home/wmoore/src/github.com/wezm/git-grab'...
remote: Enumerating objects: 30, done.
remote: Counting objects: 100% (30/30), done.
remote: Compressing objects: 100% (20/20), done.
remote: Total 30 (delta 9), reused 27 (delta 7), pack-reused 0
Receiving objects: 100% (30/30), 12.50 KiB | 12.50 MiB/s, done.
Resolving deltas: 100% (9/9), done.
Grabbed https://github.com/wezm/git-grab to /home/wmoore/src/github.com/wezm/git-grab

$ lsd --tree ~/src
/home/wmoore/src
└── github.com
   └── wezm
      └── git-grab
         ├── Cargo.lock
         ├── Cargo.toml
         └── src
            ├── args.rs
            ├── grab.rs
            └── main.rs

Install

Pre-compiled Binary

Pre-compiled binaries are available for a number of platforms.

Example to download and extract a binary:

curl https://releases.wezm.net/git-grab/3.0.0/git-grab-3.0.0-x86_64-unknown-linux-musl.tar.gz | tar zxf -

Package Manager

git-grab is packaged in these package managers:

  • Arch Linux: git-grab
  • Brew: brew install git-grab
  • Chimera Linux: git-grab

Usage

Once git-grab in installed you can use it via git grab. git automatically finds binaries named git-*, this also means that if you have a shell alias like alias g=git, g grab will also work.

USAGE:
    git grab [OPTIONS] [URL]... [--] [GIT OPTIONS]

ARGS:
    <URL>...
        One or more git URLs to clone. Any URL accepted by `git` is valid.
        In addition, URLs without a scheme such as
        github.com/wezm/grab are also accepted.

OPTIONS:
    -h, --help
            Prints help information

    -c, --clipboard
            Paste a URL to clone from the clipboard.

        --home [default: ~/src or $GRAB_HOME]
            The directory to use as "grab home", where the URLs will be
            cloned into. Overrides the GRAB_HOME environment variable if
            set.

    -n, --dry-run
            Don't clone the repository but print what would be done.

    -V, --version
            Prints version information

GIT OPTIONS:
    Arguments after `--` will be passed to the git clone invocation.
    This can be used supply arguments like `--recurse-submodules`.

ENVIRONMENT
    GRAB_HOME
        See --home

With GitHub CLI

  1. Configure an alias in the GitHub CLI:

    gh alias set --shell grab 'git grab "[email protected]:$1.git"'
    
  2. You can now grab a GitHub repo. For example:

    gh grab wezm/git-grab
    

Build from Source

Minimum Supported Rust Version: 1.70.0

git-grab is implemented in Rust. See the Rust website for instructions on installing the toolchain.

Compile-time Options (Cargo Features)

git-grab supports the following compile-time options:

  • clipboard: enable support for cloning the URL on the clipboard
    • This feature is on by default
    • On UNIX and UNIX-like systems such as BSD and Linux one of the following tools must be installed:

From Git Checkout or Release Tarball

Build the binary with cargo build --release --locked. The binary will be in target/release/git-grab.

From crates.io

cargo install git-grab

Credits

This tool is inspired by grab by @jmhodges. A small comparison:

Feature Original This Version
VCS Supported Git, Mercurial, Subversion, and Bazaar Git
Dependencies None git
Progress Information No Yes, provided by git

git-grab incorporates clipboard code from clipp by bendn under the MIT licence.

Licence

This project is dual licenced under either of:

at your option.

Dependencies

~2–10MB
~92K SLoC