3

当通过 Git 别名运行外部命令时,它从存储库的 rood 目录(通常位于 .git/ 所在的位置)运行。可以通过以下方式检查:

$ cd /some/path/inside/repo
$ echo $(git -c alias.root='!pwd' root)

现在,有没有办法获得运行别名的确切路径?


如果出现 XY 问题,这就是我正在做的事情:我想要一个启动 shell 函数的别名,该函数又运行几个 Git 命令,如 ls-files。它应该只在它被调用的路径中工作,所以它应该知道它。

如果我只运行该函数,它会很好地工作,因为它不会更改路径并准确运行它被调用的位置。但我想要更多的原生行为。我现在拥有的是

git-add-specificname -opt -opt2 --long-option -- path1 path2

我想要的是

git add-specificname -opt -opt2 --long-option -- path1 path2

不允许在 Git 中使用别名参数,因此没有机会git add specificname...

4

1 回答 1

8

您需要添加cd ${GIT_PREFIX:-.}别名。

Git 1.7.6+

配置中“”生成的进程[alias] <name> = !process可以检查GIT_PREFIX环境变量以了解在工作树中调用原始命令的位置。

git config

' GIT_PREFIX' 设置为通过git rev-parse --show-prefix从原始当前目录运行 ' ' 返回。

)

如果GIT_PREFIX未定义(因为您正在从 repo 的根文件夹执行别名),它将被替换为 ' .'。

你可以看到使用的变量t/t1020-subdirectory.sh

test_expect_success 'GIT_PREFIX for !alias' '
    printf "dir/" >expect &&
    (
        git config alias.test-alias-directory "!sh -c \"printf \$GIT_PREFIX\"" &&
        cd dir &&
        git test-alias-directory >../actual
    ) &&
    test_cmp expect actual
'
于 2015-07-30T11:22:22.090 回答