tj.git-extras/man/git-bulk.md
Pierre Ayoub 8ce63003c0
fix(git-bulk): fix workspace selection when cd fails (#1197)
* fix(git-bulk): fix workspace selection when cd fails

`cd` may fails for multiple reasons:
- mistake when editing `.gitconfig` manually
- previously existing workspace that have been removed
- ...

Currently, if `cd` fails, the `BulkOp` continue its execution ... in the
workspace defined in a higher directory that where the user, despite the
user specified a specific workspace (`-w`).

The user should be noticed of a failed `cd` (this is really not expected
for a valid configuration) and the operations should stop to not execute
something unexpected.

* fix(git-bulk): replace weak eval for better variable substitution

Get rid of poor `eval` syntax because they are vulnerable to command
injection, which may have unexpected side effects.

However, they enabled a useful feature: using environment variable
(*e.g.*, defined in a `.bashrc`) inside the `.gitconfig` to use dynamic
paths as  `bulk` workspaces.

As such, I keep this feature possible by using the Bash's ${!VAR}
syntax, which allows to get the value of one variable using the name of
a another variable. However, arbitrary command injection is not possible
anymore.

* fix(git-bulk): missing check about empty environnement variable

* style(git-bulk): typo

* docs(Commands.md): git-bulk env var feature

* docs(man/git-bulk): git-bulk env var feature

* docs(man/git-bulk): mention .gitconfig for config storage

* style(man/git-bulk): typo

* docs(man/git-bulk): run make/ronn for .1 and .html
2025-02-26 12:33:16 +08:00

3.6 KiB

git-bulk(1) -- Run git commands on multiple repositories

SYNOPSIS

git-bulk [-g] ([-a]|[-w <ws-name>]) <git command>
git-bulk --addworkspace <ws-name> <ws-root-directory> (--from <URL or file>)
git-bulk --removeworkspace <ws-name>
git-bulk --addcurrent <ws-name>
git-bulk --purge
git-bulk --listall

DESCRIPTION

git bulk adds convenient support for operations that you want to execute on multiple git repositories.

  • simply register workspaces that contain multiple git repos in their directory structure
  • run any git command on the repositories of the registered workspaces in one command to git bulk
  • use the "guarded mode" to check on each execution

OPTIONS

-a

Run a git command on all workspaces and their repositories.

-g

Ask the user for confirmation on every execution.

-w <ws-name>

Run the git command on the specified workspace. The workspace must be registered.

<git command>

Any git Command you wish to execute on the repositories.

--addworkspace <ws-name> <ws-root-directory> (--from <URL or file&rt;gt;)

Register a workspace for bulk operations. All repositories in the directories below <ws-root-directory> get registered under this workspace with the name <ws-name>. <ws-root-directory> must be absolute path.

With option '--from' the URL to a single repository or a file containing multiple URLs can be added and they will be cloned directly into the workspace. Suitable for the initial setup of a multi-repo project.

--removeworkspace <ws-name>

Remove the workspace with the logical name <ws-name>.

--addcurrent <ws-name>

Adds the current directory as workspace to git bulk operations. The workspace is referenced with its logical name <ws-name>.

git bulk --purge

Removes all defined repository locations.

git bulk --listall

List all registered repositories.

EXAMPLES

Register a workspace so that git bulk knows about it using an absolute path:

$ git bulk --addworkspace personal ~/workspaces/personal

Or register a workspace using an environment variable pointing to an absolute path:

$ git bulk --addworkspace personal '$PERSONAL_WORKSPACE'

Use option --from in order to directly clone a repository or multiple repositories 

$ git bulk --addworkspace personal ~/workspaces/personal --from https://github.com/tj/git-extras.git
$ git bulk --addworkspace personal ~/workspaces/personal --from ~/repositories.txt

repositories.txt
----------------------------------
https://host-of-git/repo-1.git
https://host-of-git/repo-2.git
https://host-of-git/repo-3.git


Register the current directory as a workspace to git bulk:

$ git bulk --addcurrent personal

List all registered workspaces:

$ git bulk --listall

Run a git command on the repositories of the current workspace:

$ git bulk fetch

Run a git command on the specified workspace and its repositories:

$ git bulk -w personal fetch

Run a git command but ask the user for confirmation on every execution (guarded mode):

$ git bulk -g fetch

Remove a registered workspace:

$ git bulk --removeworkspace personal

Remove all registered workspaces:

$ git bulk --purge

FILES

  • .gitconfig: Store the git-bulk registered workspaces under the bulkworkspaces key.

AUTHOR

Written by Niklas Schlimm <ns103@hotmail.de>

REPORTING BUGS

<https://github.com/nschlimm/git-bulk>

SEE ALSO

<https://github.com/tj/git-extras>