2014-02-28 225 views
2

你可能會認爲這不是一個常見的用例,但我很頻繁地創建新的git回購。從本質上講,我有一個存儲當前分支shell腳本到$CURRENT_BRANCH通過:沒有提交的git分支

#!/bin/sh -e 
git rev-parse --is-inside-work-tree 2>/dev/null > /dev/null 
git rev-parse --abbrev-ref HEAD 

這種運作良好,即使在非git的回購協議(這是想法)。然而,其中一個案件,它投訴很多是一個沒有提交的git回購。具體而言,我得到:

fatal:歧義參數'HEAD':未知版本或路徑不在工作樹中。 使用 ' - ' 從版本不同的路徑,像這樣: '混帳[...] - [...]'

這至少提出了兩個問題:

  1. 爲何即使我將stderrstdout重定向到null通過2>/dev/null > /dev/null
  2. 即使沒有提交,我如何獲取當前分支名稱?
+0

您正在使用兩個命令,並且只有一個命令重定向輸出。我認爲'''致命的:'''來自第二個 – Alex

+0

@Alex通常我認爲你會是對的,但是運行#2(第二個命令,重定向和所有)* still *似乎包括致命錯誤輸出 –

+0

由於'-e',第一個'rev-parse'使得腳本在* not *時在git倉庫中退出。但是當你在* git倉庫中時,* second *'rev-parse'會吐出這個錯誤(只有第一個'rev-parse'的stderr被放棄)。 – torek

回答

2

在一個空的回購中,HEAD被附加到一個不存在的分支上,所以git rev-parse無法得到一個rev [這個解釋不一定是導致代碼投訴的原因]。但git symbolic-ref不會永遠關心的SHA,所以

git symbolic-ref -q --short HEAD || echo HEAD 

帶有附加HEAD不會看任何進一步比,但如果git symbolic-refHEAD的未連接到分支所以echo保留你的失敗目前的行爲。

0

爲什麼不使用__git_ps1命令?
它最初是爲了向PS1添加這些信息而設計的,因此您可以從提示中使用它。

我用它來顯示當前的Git分支在我的提示:

PS1="\$(__git_ps1 '(%s) ')${PS1}" 

只需撥打這個打印當前分支:

__git_ps1 '%s\n' 

的參數是一個格式化字符串。 %s被分支名稱取代。
如果$PWD不在git倉庫中,該命令不會提供任何輸出。

你需要git的bash-completion來定義該版本。 它位於這裏/usr/lib/git-core/git-sh-prompt

0

您創建了哪種存儲庫?它是一個裸倉庫,是你在裸倉庫中運行這些命令嗎?運行「git分支」是否會顯示任何分支?

在裸倉庫中,它不會獲取任何有用的信息,也不建議在其中運行任何直接操作。理想情況下,我將克隆裸倉庫,然後在其中執行空提交以便開始出現分支名稱(默認爲「主」)將被創建。現在如果你想改變分支的名字。當你遇到你遇到的錯誤時,我可以在我克隆一個裸倉庫並且沒有創建任何分支的時候重現它。

或者,當您遇到此問題時是否創建了孤立分支?