my には次のエイリアスがあります.gitconfig
。
[alias]
lg = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
log-between = "!f() { git lgl `git merge-base $2 $1`..$2 -- $3 ; }; f"
log-between-p = "!g() { git lgl -p $(git merge-base $2 $1)..$2 -- $3 ; }; g"
diff-between = "!h() { echo $(pwd); git diff $(git merge-base $2 $1) $2 -- $3 ; }; h"
$3
ほとんどの場合は問題なく動作しますが、ファイル (またはパス) のログを 3 番目のパラメーター ( ) で diff-between に渡したい場合に問題が発生します。
問題は、コマンド (h
この例では) がこのリポジトリのルート ディレクトリで実行されていることです (そのpwd
ため、チェックのために印刷を追加しました)。ファイルの名前または名前付きのパスを渡していますが、必ずしも絶対パス。
例えば
このエイリアスを実行すると (展開されるコマンドを確認するためにコマンド印刷を追加しました):
diff-between = "!h() { echo $(pwd); echo "git diff $(git merge-base $2 $1) $2 -- $3" ; }; h"
以下repo_root_dir/src/
のように:
git diff-between origin/master my_branch
私は手に入れます:
git diff 66efa91ba8c74aa624d05d9ec0b13cc93cbfb6d3 my_branch --
これは問題ありません。しかし、これを(ファイルを使用して)次のように実行すると:
git diff-between origin/master my_branch some_other_subdir/src/Base.cpp
私は手に入れます:
git diff 66efa91ba8c74aa624d05d9ec0b13cc93cbfb6d3 my_branch -- some_other_subdir/src/Base.cpp
このコマンドがどこから実行されたかに関係なく (注: これは、このレポの root_dir から実行されることに注意してください)
次のように現在のディレクトリを適切に取得する方法:
- ファイルを持つ
root_dir/src/some_other_subdir/Base.cpp
- パラメータを指定してエイリアスを実行すると、次の結果が得られ
root_dir/src
ますsome_other_subdir/Base.cpp
- 注:
pwd
内部の git エイリアスが返されますroot_dir