我正在尝试cd使用我的git根目录定义一个别名git rev-parse --show-toplevel.
目前我把它作为我的别名.bashrc,它工作正常:
alias gitroot='cd "$(git rev-parse --show-toplevel)"'
Run Code Online (Sandbox Code Playgroud)
但是我知道你可以使用git别名运行shell命令,所以我想我会把命令移到.gitconfig我的文件中以使我的文件更清晰.
问题是,我无法弄清楚为什么我的别名不起作用.目前我[alias]在我的下面有这个.gitconfig:
root = "!sh -c 'cd \"$(git rev-parse --show-toplevel)\"'"
Run Code Online (Sandbox Code Playgroud)
但是当我跑步时git root,我只是留在当前目录中.
我已经尝试过其他shell别名并且他们已经工作了,例如别名say = "!sh -c 'echo \"$0\"'"工作得很好:
$ git say hello
hello
Run Code Online (Sandbox Code Playgroud)
虽然我注意到类似的cd命令(cd = "!sh -c 'cd \"$0\"'")失败了:
~/repos/myproject$ git cd /home/
~/repos/myproject$
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚它是否与我的语法有关,或者它是git别名的怪癖,它不支持cd命令,或完全不同的东西.
如果有帮助,我正在使用Git 1.7.9.5.
cdh*_*wie 18
你的shell正在调用Git,而Git正在调用另一个shell来运行你的cd命令.此命令成功,这将更改子shell的工作目录,但它不会更改Git的工作目录,也不会更改父shell的工作目录.
为了做到这一点,你需要在当前的 shell中运行命令,这意味着调用Git将无法完成此任务.您将不得不继续使用shell别名.
为了说明,假设您有以下shell脚本up.sh:
#!/bin/sh
cd ..
Run Code Online (Sandbox Code Playgroud)
如果您执行此脚本 ./up.sh那么从当前shell的角度来看,没有什么会改变,因为它cd是在一个新的shell实例中执行的.但是,如果执行它,则会. up.sh指示当前shell自己执行文件的内容,而不会生成子shell.在这种情况下,当前shell的工作目录将会更改.
这是关键的区别.使用Git别名与./up.sh方法类似,而shell别名类似于. up.sh方法.