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

git别名在错误的目录中运行,git,directory,Git,Directory,摘要:通过git别名运行的命令的当前工作目录是错误的 演示这一点的最简单方法是使用git别名,如下所示: [alias] pwd = !pwd 因此,gitpwd正在运行bash命令pwd。人们会认为这两个命令的输出是相同的。现在,让我们尝试几次: $ cd ~ $ pwd && git pwd /home/limpchimp /home/limpchimp # great! $ mkdir foo && cd foo && git

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

演示这一点的最简单方法是使用git别名,如下所示:

[alias]
    pwd = !pwd
因此,
gitpwd
正在运行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别名。有办法解决这个问题吗?我如何修复它?

TL;DR:add
cd--${GIT\u前缀:-.}位于别名其余部分的前面,例如:

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

这是一个(mis?)功能,但您可以使用
$GIT_PREFIX
解决它,如中所述:


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

这在文档中明确指定,如有需要,还提供了一个变通方法

请注意,shell命令将从顶级目录执行 存储库的目录,不一定是当前目录。 通过运行GIT rev parse--show PREFIX将GIT_前缀设置为返回的 从原始的当前目录


可能重复或更短,用于别名:
cd--“${GIT_PRFIX:-.}
PSA:请参阅下面答案中的注释。“这是明确指定的…”如果“明确指定”是指隐藏在超过2500行的手册页中的非明显、意外和非直观行为的解释。
#! /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 ...