18

我正在尝试cd使用git rev-parse --show-toplevel.

目前我将它作为我的别名.bashrc,它工作正常:

alias gitroot='cd "$(git rev-parse --show-toplevel)"'

但我知道你可以使用 git 别名运行 shell 命令,所以我想我会将命令移到我.gitconfig的文件中以使我的文件更干净一些。

问题是,我不知道为什么我的别名不起作用。目前我[alias]在我的下面有这个.gitconfig

root = "!sh -c 'cd \"$(git rev-parse --show-toplevel)\"'"

但是当我运行时git root,我只是停留在当前目录中。

我已经尝试过其他 shell 别名并且它们已经工作了,例如别名say = "!sh -c 'echo \"$0\"'"工作得很好:

$ git say hello
hello

虽然我注意到类似的cd命令 ( cd = "!sh -c 'cd \"$0\"'") 失败:

~/repos/myproject$ git cd /home/
~/repos/myproject$

我不知道这是否与我的语法有关,或者它是否是 git 别名的怪癖,它不支持该cd命令,或者完全是其他什么。

如果有帮助,我正在使用 Git 1.7.9.5。

4

1 回答 1

25

你的 shell 正在调用 Git,而 Git 正在调用另一个 shell 来运行你的cd命令。这个命令成功了,它改变了子 shell 的工作目录,但是它没有改变 Git 的工作目录,也没有改变父 shell 的工作目录。

为此,您需要在当前shell 中运行该命令,这意味着调用 Git 将无法完成此操作。您将不得不继续使用 shell 别名。


为了说明,假设您有以下称为的 shell 脚本up.sh

#!/bin/sh
cd ..

如果你执行这个脚本,./up.sh那么从你当前的 shell 的角度来看,什么都不会改变,因为cd它是在一个新的 shell 实例中执行的。但是,如果您将其执行为. up.sh,这将指示您当前的 shell 自行执行文件的内容,而不产生子 shell。在这种情况下,当前 shell 的工作目录将会改变。

这就是这里的关键区别。使用 Git 别名类似于./up.sh方法,而使用 shell 别名类似于. up.sh方法。

于 2013-09-26T15:31:59.057 回答