2017-08-09 95 views
-1

我正在閱讀一箇舊的部署腳本,我遇到了一陣困惑我的bash。拖拽一個git日誌

聲明如下。

if [[ \\$(git log @{u}.. 2> /dev/null | tail -n1) != '' ]]; 
    then echo 'LOCAL BRANCH HAS UNCOMMITTED CHANGES.'; 
fi; 

據我所知,我們正在運行一個git日誌並檢查輸出是否爲空字符串。我可能會非常失望,但這就是我要問的原因。

git log @{u}.. 2> /dev/null | tail -n1 

以上是什麼是令人困惑的部分。如果我在本地repo上運行這個函數,我會得到一個空字符串作爲返回值。我不明白爲什麼。我不明白@{u}.. 2> /dev/null是什麼意思。據我所知,2> /dev/null將可能的錯誤重定向到位於/dev/null的文件。但是這條線的其餘部分在做什麼?即@{u}

+0

請注意,這裏喊出的「UNCOMMITTED」這個詞是完全錯誤的:這些是​​ committed *改變。他們只是被當地Git相信,不會被提交給相應的上游分支機構「@ {u}」。 – torek

回答

1

正如您所提到的2> /dev/null將stderr(由POSIX定義爲文件描述符2)重定向到/dev/null,這是忽略錯誤消息的常見技巧。

@{u}是上游分支的快捷方式,請參閱this answer

git log @{u}..git log @{u}..HEAD相同。 Double dot指定一系列提交,例如,所有提交HEAD減去所有提交@{u}

因此HEAD(本地分支)減去上游分支會給你你尚未推送的本地提交。

+0

非常好,謝謝! – marcusshep