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

时间:2015-09-01 08:52:22

标签: git parameters relative-path git-alias

我的facebook\internal\Utility.java:538: error: incompatible types: Object cannot be converted to long [javac] bundle.putLong(key, (long) value); [javac] ^ [javac] Note: Some input files use or override a deprecated API. [javac] Note: Recompile with -Xlint:deprecation for details. [javac] Note: Some input files use unchecked or unsafe operations. [javac] Note: Recompile with -Xlint:unchecked for details. [javac] 4 errors [javac] 3 warnings</i> 中有以下别名:

.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" )传递给diff-between的文件(或路径)的日志时,会出现问题。

问题是该命令(此示例中为$3)正在此存储库的根目录中执行(这就是我添加h打印以进行检查的原因)我传递的名称文件或具有名称但不总是绝对路径的路径。

E.g。

当我运行此别名时(添加命令打印以检查它将扩展的命令):

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

无论此命令从何处运行(注意:请记住这是从此repo的root_dir运行的)

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

  • 拥有文件git diff 66efa91ba8c74aa624d05d9ec0b13cc93cbfb6d3 my_branch -- some_other_subdir/src/Base.cpp
  • 当我在root_dir/src/some_other_subdir/Base.cpp并使用root_dir/src参数运行我的别名时,我得到以下结果
  • 注意:git alias中的some_other_subdir/Base.cpp将返回pwd

1 个答案:

答案 0 :(得分:5)

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

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

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