用于 cd 到 git root 的 shell 命令的 git 别名未按预期工作

标签 git shell alias

我正在尝试使用 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/

相关文章:

git - 破坏性的 Git 提交?

c# - 现有 Umbraco 项目的开发

json - Composer.json 文件中的 Composer 依赖性存在细微差异

windows - 无法在 Windows 7 的 MinGW32 中创建简单的 Git 别名

bash - 如何使 Emacs 的 shell 模式源成为我的配置文件?

git - 递归 git clone 期间的用户名错误

linux - 如何处理DISPLAY=:0. 0

c# - 如何在 C# 中编写 Powershell Wrapper?

python - 下载NLTK数据时出现PermissionError

ios - 在应用程序包中添加符号链接(symbolic link)