2

私が達成しようとしていることは、この質問/回答の内容と似ています:プッシュされていないGitコミットの表示。ローカルコンピュータに、gerritサーバーに「バックアップ」されていないものがあるかどうかを調べたいと思います。

その質問の提案を使用しようとすると、Gerritを使用すると、リポジトリに受け入れられていない公開済みコミットのカテゴリに分類されるコミットも結果に表示されます。それらはpublished/BRANCH_NAMEgitkのマーカーで示されます。受け入れられなかったとしても、リモート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-remoteChronialが述べたように出力に表示されます)、出力からローカルコミットをgrepできます。

Gerritリポジトリがoriginリモートであると仮定します。

を使用git ls-remote --quietすると、すべてのリモート参照のリストを取得でき、を使用git log --pretty="%H" origin/master..masterすると、リポジトリにまだマージされていないコミットのコミットハッシュを取得できます。

したがって、Fishシェルコードに従うと、リポジトリに存在する変更が得られます。

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

git ls-remoteが行を返す場合、コミットはプッシュされています。それ以外の場合はプッシュされません。次に、必要に応じてこのフローを環境に合わせて調整します:)

パフォーマンスのためにgit ls-remote、リモートデータを常に再度フェッチするのではなく、の出力を変数に保存してそこからチェックすることをお勧めします。

GerritのSSHAPIを使用できる場合は、

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

git ls-remote詳細のJSON応答を取得する代わりにrowCount、一致の量を示します。

于 2017-03-20T13:48:18.507 に答える