Pat*_*ryk 4 git parameters relative-path git-alias
我的代码中有以下别名.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"
Run Code Online (Sandbox Code Playgroud)
虽然它在大多数情况下工作正常,但是当我想要将第三个参数($3)传递给diff-between 的文件(或路径)的日志时,会出现问题.
问题是该命令(h在此示例中)正在此存储库的根目录中执行(这就是我添加pwd打印以进行检查的原因)并且我传递的是文件名或带有名称的路径但不总是绝对路径.
例如
当我运行此别名时(添加命令打印以检查它将扩展的命令):
diff-between = "!h() { echo $(pwd); echo "git diff $(git merge-base $2 $1) $2 -- $3" ; }; h"
Run Code Online (Sandbox Code Playgroud)
在repo_root_dir/src/像这样:
git diff-between origin/master my_branch
Run Code Online (Sandbox Code Playgroud)
我会得到:
git diff 66efa91ba8c74aa624d05d9ec0b13cc93cbfb6d3 my_branch --
Run Code Online (Sandbox Code Playgroud)
这很好.但是当我这样运行时(带文件):
git diff-between origin/master my_branch some_other_subdir/src/Base.cpp
Run Code Online (Sandbox Code Playgroud)
我会得到:
git diff 66efa91ba8c74aa624d05d9ec0b13cc93cbfb6d3 my_branch -- some_other_subdir/src/Base.cpp
Run Code Online (Sandbox Code Playgroud)
无论此命令从何处运行(注意:请记住,这是从此repo的root_dir运行)
如何正确获取当前目录,以便:
root_dir/src/some_other_subdir/Base.cpproot_dir/src并使用some_other_subdir/Base.cpp参数运行我的别名时,我得到以下结果pwd里面的git别名将返回root_dirGit别名通常在当前目录中执行.除了在shell中执行的git别名(以...开头!).如果启动了shell,那么shell的工作目录将是存储库根目录.
使用${GIT_PREFIX:-./}变量.它将解析为当前目录的绝对存储库路径.
diff-between = "!h() { git diff $(git merge-base $2 $1) $2 -- ${GIT_PREFIX:-./}$3 ; }; h"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
667 次 |
| 最近记录: |