contrib に入っているコマンドを全部インストールしたかったのでとりあえず一覧にしてみた。次のコマンドでそんな感じになる:
find /usr/local/share/git-core/contrib \
-perm +111 \
-type f \
-name 'git-*' \
| grep -v /examples/
find のオプションについて少々解説。 -perm +111
で実行フラグが立っているエントリにマッチする(BSD find の場合。 GNU find なら代わりに -executable
を使う)。普通はディレクトリも実行フラグが立っているので、 -type f
でファイルだけに絞り込む。そしてファイル名が git- で始まるものに限定する。
examples ディレクトリには git の組み込みコマンドのシェルスクリプト実装が入っているので除外する。
すると以下の出力が得られる:
/usr/local/share/git-core/contrib/contacts/git-contacts
/usr/local/share/git-core/contrib/credential/netrc/git-credential-netrc
/usr/local/share/git-core/contrib/fast-import/git-import.perl
/usr/local/share/git-core/contrib/fast-import/git-import.sh
/usr/local/share/git-core/contrib/git-jump/git-jump
/usr/local/share/git-core/contrib/git-resurrect.sh
/usr/local/share/git-core/contrib/mw-to-git/git-mw.perl
/usr/local/share/git-core/contrib/mw-to-git/git-remote-mediawiki.perl
/usr/local/share/git-core/contrib/remote-helpers/git-remote-bzr
/usr/local/share/git-core/contrib/remote-helpers/git-remote-hg
/usr/local/share/git-core/contrib/stats/git-common-hash
/usr/local/share/git-core/contrib/subtree/git-subtree.sh
/usr/local/share/git-core/contrib/workdir/git-new-workdir
git-import.perl と git-import.sh が重複しているのが気になるが、同じコマンドなのでどちらか一方を使えばよさそう。それ以外は拡張子を取り除けばインストールできそうだ。
install_git_contrib_bin.zsh
#!/usr/bin/env zsh
list_git_contrib_bin() {
find /usr/local/share/git-core/contrib \
-perm +111 \
-type f \
-name 'git-*' \
| grep -v /examples/
}
list_git_contrib_bin | while read -r f; do
ln -s "$f" ~/bin/"${f:r:t}"
# ${f:r:t} は Zsh 特有の記法。
# :r で拡張子を取り除き :t で basename を取り出す。
# 詳しくは `man zshexpn` の HISTORY EXPANSION 節 Modifiers を参照。
done
できた。
蛇足: git- 系コマンド以外の実行ファイルも見るには find /usr/local/share/git-core/contrib -perm +111 -type f | grep -v '/examples\|t/'
で。