你会认为这不是一个常见的用例,但我经常创建新的git
存储库。 本质上,我有一个 shell 脚本,可以通过以下方式将当前分支存储到$CURRENT_BRANCH
中:
#!/bin/sh -e
git rev-parse --is-inside-work-tree 2>/dev/null > /dev/null
git rev-parse --abbrev-ref HEAD
这很好用,即使在非 git 存储库中也是如此(这就是这个想法)。 但是,它抱怨很多的一种情况是没有提交的 git 存储库。 具体来说,我得到:
致命:模棱两可的参数"HEAD":未知修订或路径不在工作树中。 使用"--"将路径与修订分开,如下所示: "哎呀
�
这至少提出了两个问题:
- 为什么即使我通过
2>/dev/null > /dev/null
将stderr
和stdout
重定向到null
,也会显示此错误 - 即使没有提交,如何获取当前分支名称?
在空存储库中,HEAD
附加到不存在的分支,因此git rev-parse
无法获得 rev [该解释不一定是导致代码抱怨的原因]。 但是git symbolic-ref
从不关心SHA所以
git symbolic-ref -q --short HEAD || echo HEAD
附加HEAD
不会比这更远,但是如果HEAD
没有附加到分支,则git symbolic-ref
会失败,因此echo
会保留您当前的行为。
为什么不使用 __git_ps1
命令?
它最初是为了将此类信息添加到PS1,当然您也可以从提示使用它。
我正在使用它在我的提示符中显示当前的 git 分支:
PS1="$(__git_ps1 '(%s) ')${PS1}"
只需调用以下命令即可打印当前分支:
__git_ps1 '%sn'
参数是格式化字符串。 %s
将替换为分支的名称。
如果$PWD
不在 git 存储库中,则该命令不会提供任何输出。
你需要 git 的 bash 完成才能定义该版本。它位于这里/usr/lib/git-core/git-sh-prompt
。
您创建了哪种存储库?它是否是裸存储库,您是否在裸存储库中运行这些命令?运行"git 分支"会向你显示任何分支吗?
在裸存储库中,它不会获取任何有用的信息,也不建议在其中运行任何直接操作。理想情况下,我会克隆一个裸存储库,然后在其中执行空提交以开始使用,以便创建分支名称(默认情况下为"master")。现在,如果您希望更改分支的名称。来到你遇到的错误,当我克隆一个裸存储库并且没有在其中创建任何分支时,我可以在我最后重现它。
或者,您在遇到此问题时是否创建了孤立分支。