5

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
4

1 に答える 1

7

Git エイリアスは通常、現在のディレクトリ内で実行されます。シェルで実行される git エイリアスを除く (で始まる!)。シェルが開始された場合、シェルの作業ディレクトリはリポジトリ ルートになります。

変数を使用し${GIT_PREFIX:-./}ます。現在のディレクトリの絶対リポジトリ パスに解決されます。

diff-between = "!h() { git diff $(git merge-base $2 $1) $2 -- ${GIT_PREFIX:-./}$3 ; }; h"
于 2015-09-01T10:54:51.017 に答える