2017-08-09 96 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