Ark's Blog

数学とか競プロとか参加記とか備忘録とか

ようこそ

git aliasの外部コマンド呼び出しはgit管理下のルートディレクトリから呼ばれる

知見を得たのでメモ。

git aliasの外部コマンド呼び出しは、公式ドキュメントによれば以下のように書かれています。

If the alias expansion is prefixed with an exclamation point, it will be treated as a shell command. For example, defining "alias.new = !gitk --all --not ORIG_HEAD", the invocation "git new" is equivalent to running the shell command "gitk --all --not ORIG_HEAD". Note that shell commands will be executed from the top-level directory of a repository, which may not necessarily be the current directory. GIT_PREFIX is set as returned by running git rev-parse --show-prefix from the original current directory. 引用

ざっくりまとめると

確認のため適当なgit管理下で

$ git config alias.test1 '!pwd'
$ git config alias.test2 '!echo $GIT_PREFIX'

とaliasすると、git test1でgitのルートディレクトリのパスが表示され、git test2でカレントディレクトリへの相対パスが表示されることがわかります。

なので、例えばfileコマンドをgitコマンドとして使いたい場合は

$ git config alias.file '!file "$GIT_PREFIX$1"'

のようにすれば

$ git file <filename>

でfileコマンドが使えるようになります。

複雑なコマンドをaliasしたいときに使える知見かもしれません。