The git-rexec command-line tool that recursively locates Git repositories within a directory and executes commands against them, either sequentially or in parallel.
Here are examples demonstrating how to use git-rexec:
-
Execute
git status -sacross all discovered Git repositories (found by searching recursively under the current working directory) in parallel (-por--parallel):git-rexec -p -- git status -s -
Fetch updates across all discovered repositories, limiting the concurrency to 5 background jobs (
-j 5), which helps avoid network congestion or server rate limits when communicating with upstream Git remotes:git-rexec -j 5 --parallel -- git fetch -
Target a specific base directory (
~/projects) using the-Cflag to recursively discover repositories within it, while explicitly excluding a specific subfolder (~/projects/archive). This example executesgit status -sin parallel for all discovered repositories except those within the excluded path:git-rexec -C ~/projects --exclude-dir ~/projects/archive --parallel -- git status -s -
Evaluate whether a
README.mdfile exists in the repository (sh -c "test -f README.md"). If the condition returns an exit status of 0 (success), it counts the number of lines in that file (wc -l README.md):git-rexec --if-exec 'sh -c "test -f README.md"' --parallel -- wc -l README.md
If this helps your workflow, please support the project by ⭐ starring git-rexec on GitHub and sharing it on your website, blog, Mastodon, Reddit, X, LinkedIn, or other social media platforms to help more Git users discover its benefits.
Features
- Recursively discover Git repositories starting from a specified root directory.
- Execute shell commands across multiple repositories in parallel using worker threads.
- Filter target repositories based on the exit code of a conditional check (
--if-exec). - Exclude specific directories from the search path.
- Optional: Can leverage
fdfor fast directory traversal if installed, falling back to standard Python path resolution otherwise.
Installation
Method 1: Manual Installation (System-wide)
Download the git-rexec script, make it executable, and copy it to a directory in your system PATH (e.g., /usr/local/bin):
sudo cp git-rexec /usr/local/bin/
Method 2: Installation via pip
Install the package directly from the Git repository using pip:
pip install --user git-rexec
Dependencies
System Dependencies
git: Required for repository validation and execution.fd(Optional): Highly recommended for faster repository discovery.
Python Dependencies (Optional)
colorama: Provides color-coded terminal output.setproctitle: Sets the process title for process monitoring tools.
You can install the optional Python dependencies via pip:
pip install colorama setproctitle
Usage
git-rexec [OPTIONS] [exec_cmd ...]
(Assuming the git-rexec script is executable and in your PATH.)
Positional Arguments
exec_cmd: The shell command to execute within each discovered Git repository. You can use--to pass options directly to the command. If omitted, the script simply prints the paths of the discovered repositories.
Options
-C, --directory <path>: The root directory to start searching for Git repositories. Defaults to the current working directory (.).--exclude-dir <path>: Exclude a specific directory and all of its subdirectories from the search. This option can be provided multiple times.-p, --parallel: Execute the command in parallel using threads.-i, --if-exec <command>: Execute the main command only if this check command returns an exit code of0.-j, --jobs <int>: The maximum number of concurrent workers/processors to use for parallel execution. Defaults to the number of CPU cores available.-h, --help: Show the help message and exit.-q, --quiet: Quiet mode. Suppresses the informational tracking headers ([EXEC]and[EXEC-P]) that prefix execution output. In sequential mode, it hides the[EXEC]repository delimiter line entirely; in parallel mode (-p), it strips the yellow[EXEC-P]header track and removes the four-space indentation, printing only the raw, unindented stdout and stderr streams. This flag has no effect when no execution command is supplied, allowing discovered repository paths to print normally.
License
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Copyright (C) 2019-2026 James Cherti.
Links
Related posts:
- bash-stdops – A collection of Bash helper scripts that facilitate operations
- Gentoo Linux: Unlocking a LUKS Encrypted LVM Root Partition at Boot Time using a Key File stored on an External USB Drive
- Using Emacs vc-diff with tools such as git-crypt or Rails credentials: Handling Binary Diff Issues
- Ansible: Installing and configuring Gitolite using Ansible for secure Git repository management
- Gentoo: How to Speed Up emerge ‐‐sync
- Bash shell: Interactive Menu to Insert any String from the Tmux Scrollback Buffer Into the Shell Prompt
- Vim theme: tomorrow-night-deepblue, a refreshing color scheme with a deep blue background