#git #parallel #parallel-processing #cargo #cd

bin+lib gitall

Executes git(1) commands in repos below a parent directory

9 releases (5 breaking)

0.6.0 Dec 12, 2021
0.5.0 Feb 22, 2021
0.4.0 Oct 19, 2020
0.3.0 Oct 15, 2020
0.1.1 Mar 9, 2019

#1111 in Development tools

Download history 13/week @ 2023-10-26 6/week @ 2023-11-02 2/week @ 2023-11-09 11/week @ 2023-11-16 11/week @ 2023-11-23 39/week @ 2023-11-30 3/week @ 2023-12-07 12/week @ 2023-12-14 19/week @ 2023-12-21 10/week @ 2023-12-28 1/week @ 2024-01-04 1/week @ 2024-01-11 10/week @ 2024-01-18 18/week @ 2024-01-25 18/week @ 2024-02-01 11/week @ 2024-02-08

58 downloads per month

Unlicense OR MIT

388 lines


gitall recursively finds all repositories below a directory and runs the given Git command in each repository in parallel.

GitHub Workflow Status Crate Documentation


The simplest form is to cd to a directory containing all the repos you want to operate on, then write your Git command changing git to gitall. To pass options to the Git command, you must add -- before your command to tell gitall to stop parsing its own options and pass them to Git. For example, to list all remote and local repository branches you need to run gitall -- branch -va.

Pro Tip: if you add a file called git-foo to your PATH (either via copying or symlinking), you can call that program through git using git foo; no additional aliases or setup needed. So, after running ln -s /usr/bin/gitall /usr/bin/git-all, you can use gitall via git all exactly the same as if you used gitall.


Print the latest commit SHA:

Fetch the latest changes for all your repositories under ~/code:

$ cd ~/code
$ gitall fetch origin
From github.com:mattmahn/gitall.rs
   17acab9..8994d3c  master     -> origin/master
 * [new branch]      windows-build -> origin/windows-build

From github.com:holidayextras/jsonapi-server
 * [new branch]      greenkeeper/debug-4.1.1 -> origin/greenkeeper/debug-4.1.1
 * [new branch]      greenkeeper/eslint-plugin-node-8.0.0 -> origin/greenkeeper/eslint-plugin-node-8.0.0
 * [new branch]      greenkeeper/jscpd-0.6.25 -> origin/greenkeeper/jscpd-0.6.25
 * [new branch]      greenkeeper/jscpd-1.0.0 -> origin/greenkeeper/jscpd-1.0.0
 * [new branch]      greenkeeper/jscpd-1.0.1 -> origin/greenkeeper/jscpd-1.0.1
 * [new branch]      greenkeeper/jscpd-1.0.2 -> origin/greenkeeper/jscpd-1.0.2
 * [new branch]      greenkeeper/jscpd-1.0.3 -> origin/greenkeeper/jscpd-1.0.3
 * [new branch]      greenkeeper/jscpd-1.1.0 -> origin/greenkeeper/jscpd-1.1.0
 * [new branch]      greenkeeper/jscpd-1.2.0 -> origin/greenkeeper/jscpd-1.2.0
 * [new branch]      greenkeeper/jscpd-1.2.1 -> origin/greenkeeper/jscpd-1.2.1
 * [new branch]      greenkeeper/jscpd-1.2.2 -> origin/greenkeeper/jscpd-1.2.2
 * [new branch]      greenkeeper/jscpd-1.2.3 -> origin/greenkeeper/jscpd-1.2.3
 * [new branch]      greenkeeper/jscpd-2.0.0 -> origin/greenkeeper/jscpd-2.0.0
 * [new branch]      greenkeeper/jscpd-2.0.1 -> origin/greenkeeper/jscpd-2.0.1
 * [new branch]      greenkeeper/jscpd-2.0.2 -> origin/greenkeeper/jscpd-2.0.2
 * [new branch]      greenkeeper/jscpd-2.0.3 -> origin/greenkeeper/jscpd-2.0.3
 * [new branch]      greenkeeper/jscpd-2.0.4 -> origin/greenkeeper/jscpd-2.0.4
 * [new branch]      greenkeeper/qs-6.6.0 -> origin/greenkeeper/qs-6.6.0
 * [new branch]      mast       -> origin/mast

Alternatively, you can run gitall -D ~/code fetch origin from any directory.


Executes git(1) commands in repos below a parent directory

    gitall [FLAGS] [OPTIONS] <COMMAND>...

    -L, --follow
            When specified, symbolic links will be followed when navigating the directory tree.

            By default, REGEX matches against only the directory name. Using this flag, REGEX matches against the full
            canonical path.
    -h, --help
            Prints help information

    -V, --version
            Prints version information

        --color <WHEN>
            Controls when to use color [default: auto]  [possible values: always, true, auto, never, false]

    -D, --directory <DIR>
            The directory to start searching under [default: .]

    -X, --executable <PROGRAM>
            The program to run in each repo [default: git]

    -d, --max-depth <LEVELS>
            Descend at most LEVELS of directories below DIR

    -r, --regex <REGEX>
            Filters command to repo(s) matching provided regular expression [default: .*]

    -j, --threads <NUM>
            The maximum number of commands to run in parallel

            A single git command to run in each repo



  • Git
  • Rust & Cargo (for build only)

You can install gitall from crates.io with

$ cargo install gitall

Or download pre-built binaries for some platforms on the releases page. After extracting the release artifacts, move the gitall executable to some directory in your PATH. Refer to your shell's documentation for installing the completion scripts located in complete/.

From source

Clone this repository, build gitall, then copy the executable to a directory in your PATH:

$ git clone https://github.com/mattmahn/gitall.rs && cd gitall.rs
$ cargo build --release
# install target/release/gitall /usr/bin/

Shell completions for Bash, Zsh, fish, Elvish, and PowerShell are also generated during build; you can find them at target/release/build/gitall-<hash>/out/. Refer to your shell's documentation for installation.


~92K SLoC