Git Aliasで引数を受け取る

Gitで引数を受け取ることのできるAliasの書き方があるようなので、紹介しておきます。

mikebarkas.dev

基本形は以下の通り。

[alias]
  echo = "!f() { echo ${1}; }; f"

このように~/.gitconfig記載すると、

$ git echo foo
foo

Aliasの先頭に!を付けるとシェルコマンドとして認識されるので(つけないとpullcommitなど、gitコマンドのサブコマンドと認識されます)、つまり上記はシェル関数を定義して即時実行するという仕組みです。 考えてみればシンプルですが、これは物凄く応用範囲が広くて便利です。 たとえば、以下のような感じに使えます。

[alias]
  ls-repos = "!find . -type d -name .git | xargs dirname"
  for-all = "!f() { for DIR in $(git ls-repos); do git -C $DIR $@ & done; wait; }; f"

ls-reposでカレントディレクトリ下のすべてのローカルリポジトリを列挙するエイリアスです。 for-allは、このls-reposで列挙した各ローカルリポジトリgitコマンドを実行します。 このときサブコマンドを引数として与えているので、任意の操作を行うことができます。

$ ls
repo-1 repo-2 repo-3
$ git for-all pull
Already up to date.
Already up to date.
Already up to date.

みたいな感じ。

個人的には、Go Workspaceで複数リポジトリを使用しているのでこれが便利です。

ちなみに以上はGit AliasのシェルがBashの場合です。Zshだとシンプルにecho = "(){ echo ${1} }"という感じに書けるとかなんとか。