如何在带参数的 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 的 运行这个回购)
如何正确获取当前目录以便:
- 有文件
root_dir/src/some_other_subdir/Base.cpp
- 当我在
root_dir/src
和 运行 我的别名和 some_other_subdir/Base.cpp
参数时,我得到以下结果
- 注意:git 内的
pwd
别名将 return root_dir
Git 别名通常在当前目录中执行。除了在 shell 中执行的 git 别名(以 !
开头)。如果启动 shell,shell 的工作目录将是存储库根目录。
使用${GIT_PREFIX:-./}
变量。它将解析为当前目录的绝对存储库路径。
diff-between = "!h() { git diff $(git merge-base ) -- ${GIT_PREFIX:-./} ; }; h"
我的 .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 的 运行这个回购)
如何正确获取当前目录以便:
- 有文件
root_dir/src/some_other_subdir/Base.cpp
- 当我在
root_dir/src
和 运行 我的别名和some_other_subdir/Base.cpp
参数时,我得到以下结果 - 注意:git 内的
pwd
别名将 returnroot_dir
Git 别名通常在当前目录中执行。除了在 shell 中执行的 git 别名(以 !
开头)。如果启动 shell,shell 的工作目录将是存储库根目录。
使用${GIT_PREFIX:-./}
变量。它将解析为当前目录的绝对存储库路径。
diff-between = "!h() { git diff $(git merge-base ) -- ${GIT_PREFIX:-./} ; }; h"