2

我想要完成的事情类似于这个问题/答案中的内容:查看未推送的 Git 提交。我想知道我的本地计算机中是否有任何东西在 gerrit 服务器中没有“备份”。

当尝试使用该问题中的建议时,当使用 Gerrit 时,结果还列出了属于尚未接受回购的已发布提交类别的提交。它们published/BRANCH_NAME在 gitk 中用标记显示。我只想显示尚未推送到远程 gerrit 存储库的提交,即使它们未被接受。

例如,如果我git log --graph --branches --not --remotes --decorate在我得到的提交中使用

commit 51blahblah123...456blah42e3 (refs/published/blah_fix, blah_fix)
Author: xyz <...>
Date:   Wed Jul 22 12:28:39 2012 -0500

  Commit description

  Change-Id: I83ae...blah...184

这些是我想跳过的提交类型。在 gitk 中,最后发布的提交显示为紫色背景,而不是分支名称上的绿色背景。有--remotes那些的等价物吗?

我也尝试过使用git log origin/master..HEAD,但出现以下错误:

 fatal: ambiguous argument 'origin/master..HEAD': unknown revision or path not in the working tree.

因此,我尝试使用特定的修订版(我认为我使用的是工作分支而不是远程的主分支)并且它起作用了,但是这种绑架违背了目的,因为我必须去寻找所有的分支。

我也考虑git log @{u}.. --graph --decorate过,但这似乎跳过了我无法通过远程跟踪创建(错误地)的分支。

4

2 回答 2

1

此命令将列出所有可以从本地分支访问但不在远程上的提交(假设您的远程被调用origin):

git ls-remote origin | cut -f 1 | xargs git log --graph --decorate --branches --not
于 2012-12-16T17:38:37.053 回答
0

为了查看是否已将提交推送到远程存储库(Gerrit 的变更集记录在存储库中,因此它们将出现在git ls-remote输出中,如 Chronial 所述),您可以从输出中 grep 本地提交。

假设您的 Gerrit 存储库是origin远程的:

使用git ls-remote --quiet您可以获得所有远程引用的列表,并且git log --pretty="%H" origin/master..master您可以获得尚未合并到存储库的提交的提交哈希。

因此,以下 Fish shell 代码将为您提供存储库中存在的更改:

for i in (git log --pretty="%H" origin/master..master)
    git ls-remote --quiet | grep $i
end

如果git ls-remote返回一行,则提交已被推送,否则不会。然后根据需要将此流程调整为您的环境:)

为了性能,您可能希望将输出保存git ls-remote到变量并从那里检查,而不是总是再次获取远程数据。

如果您可以使用Gerrit 的 SSH API,您可以使用

ssh -p 29418 -l GERRIT_USER GERRIT_SERVER gerrit query --format=json 7b5a1d510

而不是git ls-remote获取详细信息的 JSON 响应,在哪里rowCount可以知道匹配的数量。

于 2017-03-20T13:48:18.507 回答