如何在带参数的 git 别名中获取文件的相对路径?

How to get file's relative path in git aliases with parameters?

我的 .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  `.. --  ; }; f"
  log-between-p = "!g() { git lgl -p $(git merge-base  ).. --  ; }; g"
  diff-between = "!h() { echo $(pwd); git diff $(git merge-base  )  --  ; }; h"

虽然它在大多数情况下工作正常,但当我想获取将第三个参数 (</code>) 传递给 diff-between 的文件(或路径)的日志时,问题就出现了。 </p> <p>问题是命令(本例中的<code>h)正在该存储库的根目录中执行(这就是为什么我添加了pwd打印以进行检查)并且我正在传递文件名或带名称但不总是绝对路径的路径。

例如

当我运行这个别名(添加命令打印以检查它将扩展到什么命令)时:

  diff-between = "!h() { echo $(pwd); echo "git diff $(git merge-base  )  -- " ; }; 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 的 运行这个回购)


如何正确获取当前目录以便:

Git 别名通常在当前目录中执行。除了在 shell 中执行的 git 别名(以 ! 开头)。如果启动 shell,shell 的工作目录将是存储库根目录。

使用${GIT_PREFIX:-./}变量。它将解析为当前目录的绝对存储库路径。

diff-between = "!h() { git diff $(git merge-base  )  -- ${GIT_PREFIX:-./} ; }; h"