我正在尝试使用 git rev-parse --show-toplevel
定义一个别名,以便 cd
我进入 git 根目录。
目前我将它作为我的 .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。
最佳答案
您的 shell 正在调用 Git,而 Git 正在调用另一个 shell 来运行您的 cd
命令。此命令成功,这会更改子 shell 的工作目录,但不会更改 Git 或父 shell 的工作目录。
为此,您需要在当前 shell 中运行命令,这意味着调用 Git 将无法完成此操作。您将不得不继续使用 shell 别名。
为了说明,假设您有以下名为 up.sh
的 shell 脚本:
#!/bin/sh
cd ..
如果您将此脚本作为 ./up.sh
执行,那么从您当前的 shell 的角度来看,什么都不会改变,因为 cd
是在一个新的 shell 实例中执行的。但是,如果您将其作为 执行。 up.sh
,这会指示您当前的 shell 自行执行文件的内容,而无需生成子 shell。在这种情况下,当前 shell 的工作目录将会改变。
这是这里的关键区别。使用 Git 别名类似于 ./up.sh
方法,而 shell 别名类似于 。 up.sh
方法。
关于用于 cd 到 git root 的 shell 命令的 git 别名未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19032372/