Git别名在错误的目录中操作

24

总结:通过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
可能是为什么使用git别名运行命令会产生不同的结果?的重复问题。 - Jonathan Wakely
2个回答

27
TL;DR:在别名的其余部分前面添加cd -- \"${GIT_PREFIX:-.}\";,例如:
[alias]
    pwd = !cd -- \"${GIT_PREFIX:-.}\"; pwd

这是一个(误?)功能,但你可以通过使用$GIT_PREFIX来解决它,如这个其他stackoverflow问题和答案中所述。
#! /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 ...

(正如Tom Hale在评论中指出的那样),可以使用sh / bash / POSIX-shell功能${var:-default}来缩短这个过程,其中未设置或空字符串变量值会扩展为冒号破折号字符对之后给定的默认值。我们使用--是因为bash已经向cd命令添加了选项,所以为了健壮性,我们应该处理前缀变量包含例如-e的情况。双引号也不是必需的:我在上面使用它们是为了与较长版本中的test命令保持对称,较长版本将其拼写为[。)

2
或者更短,用于别名:cd -- "${GIT_PRFIX:-.} - Tom Hale

11

这在文档中已经明确说明,并提供了必要的解决方法。

Git配置别名

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


5
如果你所说的“明确规定”是指对于非明显、令人惊讶和不直观行为的解释被埋在超过2500行的man手册中,那么这显然是有问题的。 - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接