我尝试使用git rev-parse --show-toplevel
在git根目录中定义cd
的别名。
目前,我在.bashrc
中使用它作为别名,它工作正常:
alias gitroot='cd "$(git rev-parse --show-toplevel)"'
字符串
但是我知道你可以使用git别名来运行shell命令,所以我想我应该把这个命令移到我的.gitconfig
中,让我的文件更干净一些。
问题是,我不知道为什么我的别名不起作用。目前我在.gitconfig
中的[alias]
下有这个:
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。
2条答案
按热度按时间qojgxg4l1#
您的shell正在调用Git,而Git正在调用另一个shell来运行您的
cd
命令。此命令成功,这会更改子shell的工作目录,但不会更改Git的工作目录,也不会更改父shell的工作目录。为了做到这一点,你需要在你的 * 当前 * shell中运行命令,这意味着调用Git将无法完成这一点。你必须继续使用shell别名。
为了说明,假设您有以下名为
up.sh
的shell脚本:字符串
如果您以
./up.sh
的身份执行此脚本,那么从当前shell的Angular 来看不会发生任何变化,因为cd
是在新的shell示例中执行的。但是,如果您以. up.sh
的身份执行它,则会指示当前shell自行执行文件的内容,而不会产生子shell。在这种情况下,当前shell的工作目录将发生变化。这就是这里的关键区别。使用Git别名类似于
./up.sh
方法,而shell别名类似于. up.sh
方法。eqzww0vc2#
作为@cdhowie explained,你不能在一个实际的Git别名中做到这一点。但是你可以用一种几乎与Git别名没有区别的方式来实现这一点,使用wrapper function:
字符串
除了在
PWD
中访问Git repo的根目录之外,还有以下功能:local
变量可以避免污染命名空间。git rev-parse --show-toplevel
退出代码(通常是因为您不在Git存储库中)。cd
连接到根目录失败,则返回cd
退出代码。git root
以外的任何命令转发到git
命令本身。