简介:通过git别名运行的命令的当前工作目录是错误的.
证明这一点的最简单方法是使用这样的git别名:
[alias]
pwd = !pwd
Run Code Online (Sandbox Code Playgroud)
所以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...?
Run Code Online (Sandbox Code Playgroud)
似乎git正在将当前工作目录更改为具有.git文件夹(如果存在)的第一个父目录.这是非常有问题的; 它搞砸了我编写的某些脚本,这些脚本意味着在特定的目录中运行,并且使我无法将某些东西用作git别名.有没有解决的办法?我该如何解决?
tor*_*rek 14
TL; DR:cd -- ${GIT_PREFIX:-.};在别名的其余部分前添加,例如:
[alias]
pwd = !cd -- ${GIT_PREFIX:-.}; pwd
Run Code Online (Sandbox Code Playgroud)
这是一个(错误?)功能,但您可以使用此其他stackoverflow问题和答案中的$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 ...
Run Code Online (Sandbox Code Playgroud)
(正如Tom Hale在评论中指出的那样,可以使用sh/bash/POSIX-shell功能$ {var:-default}来缩短它,其中unset或empty-string变量值扩展为冒号后给定的默认值我们使用--因为bash已经为命令添加了选项cd,所以为了健壮,我们应该处理一个前缀变量包含的情况,比如说-e.双引号也不是必需的:我在上面使用它们与test命令对称,上面的长版本拼写为[.)
And*_*w C 10
在文档中明确指出了这一点,如果需要,还有一个解决方法.
请注意,shell命令将从存储库的顶级目录执行,该目录可能不一定是当前目录.通过从原始当前目录运行git rev-parse --show-prefix来设置GIT_PREFIX