git别名在错误的目录中运行

时间:2014-10-07 18:52:49

标签: git directory

总结:通过git别名运行的命令的当前工作目录是错误的。

证明这一点的最简单方法是使用这样的git别名:

[alias]
    pwd = !pwd

所以git pwd正在运行bash命令pwd。人们会认为这两个命令'产出将是相同的。现在,让我们试试几次:

$ cd ~
$ pwd && git pwd
/home/limpchimp
/home/limpchimp    # great!
$ mkdir foo && cd foo && git init
Initialized empty Git repository in /home/limpchimp/foo/.git/
$ pwd && git pwd
/home/limpchimp/foo
/home/limpchimp/foo  # great!
$ mkdir bar && cd bar
$ pwd && git pwd
/home/limpchimp/foo/bar
/home/limpchimp/foo   # uuhhhhhhhh...?

似乎git正在将当前工作目录更改为具有.git文件夹(如果存在)的第一个父目录。这是非常有问题的;它搞砸了我写过的某些脚本,这些脚本意味着在特定的目录中运行,并且使我无法将某些东西用作git别名。有没有解决的办法?我该如何解决?

2 个答案:

答案 0 :(得分:14)

TL; DR:在别名的其余部分前添加cd -- ${GIT_PREFIX:-.};,例如:

[alias]
    pwd = !cd -- ${GIT_PREFIX:-.}; pwd

这是一个(错误?)功能,但您可以使用$GIT_PREFIX中所述的#! /bin/sh # script to do stuff in a git dir # since we're sometimes run from a git alias we need # to cd back into $GIT_PREFIX if it's set [ "$GIT_PREFIX" != "" ] && cd -- "$GIT_PREFIX" ... rest of script ... 解决此问题:

--

(作为this other stackoverflow question and answer,可以使用sh / bash / POSIX-shell功能$ {var:-default}来缩短它,其中unset或empty-string变量值扩展为冒号后给定的默认值-dash字符对。我们使用cd因为bash已将 options 添加到-e命令,所以为了健壮,我们应该处理一个前缀变量包含的情况,比方说, test。双引号也不是必需的:我使用[命令在上面使用它们来对称,上面的较长版本拼写为{{1}}。)

答案 1 :(得分:9)

在文档中明确指出了这一点,如果需要,还有一个解决方法。

Git Config Alias

  

请注意,shell命令将从顶级目录执行   存储库,可能不一定是当前目录。   通过运行git rev-parse --show-prefix将GIT_PREFIX设置为返回   从原来的当前目录