Gitコミット数を取得するにはどうすればよいですか?


753

Gitリポジトリのコミット数を取得したいのですが、SVNリビジョン番号と少し似ています。

目標は、それを一意の増分ビルド番号として使用することです。

私は現在、Unix / Cygwin / msysGitでそのようにしています:

git log --pretty=format:'' | wc -l

しかし、それは少しハックのように感じます。

それを行うより良い方法はありますか?実際にwcGit が必要ない場合や、Gitも必要ない場合は、それでかっこいいので、裸のWindowsでも機能します。ファイルまたはディレクトリ構造を読み取るだけ...


1
ここで興味深い答えが見つかるかもしれません:リビジョン番号に相当するgitは何ですか?
セバスチャンヴァレット

190
git rev-list HEAD --count git rev-list
Jake Berger

14
@jberger:コメントを回答に変換する必要があると思います。
utapyngo 2013年

@utapyngo:他の13の答えを考えれば、私はそれが埋葬されることを知っていました。私はそれをここに投稿しました。
Jake Berger

@jberger、この回答はgit1.7.0では機能しません。
Vorac 2016年

回答:


1160

改訂のためのコミット数(取得するにはHEADmasterコミットハッシュ):

git rev-list --count <revision>

すべてのブランチのコミット数を取得するには:

git rev-list --all --count

これをビルド識別子に使用しないことをお勧めしますが、必要な場合は、ビルド対象のブランチのカウントを使用するのがおそらく最善です。これにより、同じリビジョンの番号は常に同じになります。すべてのブランチのカウントを使用すると、他のブランチでのアクティビティによって数が変わる可能性があります。


27
git shortlog | grep -E '^[ ]+\w+' | wc -l合計数を取得したい場合、およびgit shortlog | grep -E '^[^ ]'すべての貢献者のコミット数を取得したい場合。
スケーリー

2
ご指摘ありがとうございwc -lます。ミニマリズムFTW。私はそれを私の答えに組み込んだ。
Benjamin Atkin、

17
この解決策はハックであり(git log --pretty=format:'' | wc -l元の質問で与えられたアプローチと同様)、正しくありません。一致を反転(git shortlog | grep -Ev '^[ ]+\w+')し、メッセージのないコミット(つまり、「<none>」)がカウントされないことを確認すると、これを確認できます。使用するgit rev-list HEAD --count方が簡潔で正確です。
ctrueden 2013年

17
@BenAtkin:お詫び。不快感を与えるのは私の意図ではなく、単なる事実でした。回答日についてのポイント。当時、あなたのソリューションは、利用可能な最高のものであったかもしれません。しかし、私git rev-list HEAD --countは今より良い解決策である私の声明を支持します。
ctrueden 2013年

3
回答も追加し、古いバージョンでも動作します:git log --oneline | wc -l
ジミー・ケイン

155

git shortlog 片道です。


5
タイ。これは、範囲内のコミットをカウントするときに私にとってはうまくいきました。git shortlog sha1..sha2
RJFalconer

1
はい、git shortlogの最初の行にはコミット数が含まれています。問題が解決しました。
ロバートマサイオリ

5
コミット数はコミッターごとにグループ化されており、あまり良くありません。git shortlogの行を数えることはできますが、これは何らかの理由(ページャー?)のために端末なしではsshで機能しません。依頼者独自の解決策が最高です!git log --pretty = format: '' | wc -l
サムワトキンス

4
しかし、私はgit rev-list HEAD --count、OPで与えられた元のアプローチよりも提案するでしょう。私のテストでgit log --pretty=format:'' | wc -lは、1つずれています。
ctrueden 2013年

3
@ctrueden git log --oneline | wc -lは1ずつずれていません(OS X 10.8.5)。
アンディスチュワート

111

git rev-list HEAD --count

git rev-list

git rev-list <commit>:指定されたコミット(この場合はHEAD)からの親リンクをたどることによって到達可能なコミットをリストします。

--count :リストされたコミットの数を示す数値を出力し、他のすべての出力を抑制します。


101

このコマンドは、コミッターごとにグループ化されたコミットの数を返します。

git shortlog -s

出力:

14 John lennon
9  Janis Joplin

-s引数がの短縮形であることを知りたい場合があり--summaryます。


11
git shortlogそれ自体では、(作成者によってグループ化されていない)コミットの総数の元の問題に対処していません。git rev-list HEAD --count代わりに使用してください。
ctrueden 2013年

5
驚くばかり!あなたはでそれを並べ替えることができます| sort -nあまりにも
モフセン

54

コミットのための一意でありながら読みやすい識別子を探している場合は、git describe最適です。


2
これは機能する可能性があり、カスタムメイドのアルゴよりも使いやすいでしょう。+1
VonC 2009年

2
私はgitが説明するのを知りませんでした。タグ名とsha1の間にあるこの小さな数字は、まさに私が探していたものです。ありがとうございました。
Splo

2
GIT-VERSION-GENスクリプトとgitリポジトリでの使用方法、およびLinuxカーネルソースでの同様のスクリプト(およびMakefileでの使用方法)をご覧ください。
JakubNarębski

これにより一意のIDが与えられますが、INCREMENTAL IDは与えられません。うまくいきません。ただし、Ben Atkinの回答はコミット数を示しており、実際には増分する必要があります。Aaron Digullaの答えはより確実ですが、さらに作業が必要です。
JOM 2011年

2
はい、それは、インクリメンタル IDの概念が分散バージョン管理システムでは意味をなさないためです。
ボンベ

34

あなたはGitの「リビジョン番号」について考える最初の人ではありませんが、wcコミットは消去または破棄され、履歴が再検討されるため、 ' 'は非常に危険です。

「リビジョン番号」は、マージのに必要となるため、Subversionにとって特に重要でした(SVN1.5と1.6はその面で改善されています)。

正しい番号を決定するためにブランチのすべての履歴調べることを含まないアルゴリズムを使用して、コメントにリビジョン番号を含めるpre-commitフックで終わる可能性があります。

Bazaarは実際にそのようなアルゴリズムを思いついたので、あなたがやりたいことの良い出発点になるかもしれません。

(なので Bombeの回答が指摘するように、Gitには実際には、最新のタグ、コミット数、およびSHA-1キーのビットに基づく独自のアルゴリズムがあります)。それがあなたのために働くなら、あなたは彼の答えを見て(そして賛成投票するべきです)。


説明する アーロンのアイデアに、アプリケーションの「info」ファイルにGitコミットハッシュを追加することもできます。と共に配布してます。

そうすると、aboutボックスは次のようになります。

About box

アプリケーション番号はコミットの一部ですが、「アプリケーションの「情報」ファイル」はパッケージングプロセス中に生成され、アプリケーションビルド番号を技術リビジョンIDに効果的にリンクします


2
Xcode 3で動作するようにスクリプトを更新しました。最新バージョンはgist.github.com/208825から入手できます。
Abizern、2009年

34

Uは次のように使用できます:

git shortlog -s -n

結果:

 827  user one
    15  user two
     2  Gest 

22

簡単な方法は次のとおりです。

 git log --oneline | wc -l

oneline それを保証します。


1
'wc'は、内部または外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
user815693 2015

さて、あなたはどのシステムを使用していますか?それはUNIXのものですか?/
ジミー・ケイン

1
これは、何千ものコミットがある場合にも高速に見えます。他のすべてのコマンドは時間がかかりすぎます。
Danny Coulombe 2017年

21

変数に入れるには、最も簡単な方法は次のとおりです。

export GIT_REV_COUNT=`git rev-list --all --count`

5
確かに、他の言い方とgit rev-listは異なり、使用する正しいツールですgit log
Nayuki

1
系統内のコミット数をカウントしてHEADに到達するには:git rev-list --first-parent | wc -l
200_success 2013年

スイッチをwc -l使用する必要はありません。--countgit rev-list --all --count
SLM 2016

@slmに感謝します。答えを更新しました。ただし、元の答えは--countスイッチ自体より古いと思います。
John Gietzen 16

@JohnGietzen-そうそう、私はその8)を理解しました、助けるためにこの詳細を追加していました。
slm

17

Git shortlogは、コミットの詳細を取得する1つの方法です。

git shortlog -s -n

これにより、コミット数の後に作者名が表示されます。-sオプションは、作成者が行った各コミットのコミットメッセージをすべて削除します。コミットメッセージも表示する場合は、同じオプションを削除してください。-nオプションは、リスト全体をソートするために使用されます。お役に立てれば。


2
git shortlogそれ自体では、(作成者によってグループ化されていない)コミットの総数の元の問題に対処していません。git rev-list HEAD --count代わりに使用してください。
ctrueden 2013年



4

masterなどの1つのブランチを使用している場合、これはうまく機能すると思います。

git rev-list --full-history --all | wc -l

これは数値のみを出力します。あなたはそれを次のようにエイリアスすることができます

git revno

本当に便利に。これを行うには、.git/configファイルを編集して次の場所に追加します。

[alias]
    revno = "!git rev-list --full-history --all | wc -l"

これはWindowsでは機能しません。そのOSの「wc」に相当するものはわかりませんが、カウントを行うためのPythonスクリプトを作成すると、マルチプラットフォームのソリューションになります。

編集:2つのコミット間のカウントを取得します。


2つの任意のリビジョン間のコミット数を取得する方法を示す答えを探していましたが、何も表示されませんでした。

git rev-list --count [older-commit]..[newer-commit]

3

ビルド中に番号を生成し、ファイルに書き込みます。リリースするときはいつでも、コメント「ビルド147」(または現在のビルド番号が何であれ)を付けてそのファイルをコミットしてください。通常の開発中にファイルをコミットしないでください。これにより、Gitでビルド番号とバージョンを簡単にマッピングできます。


2人の分散開発者がこれを行った場合、ビルド番号が定期的に衝突/交差しないでしょうか?両方が共有レポの同じリビジョン間でビルドを行った場合、またはおそらくいずれかの変更が共有レポにコミットされていない場合にのみ衝突が発生します。わからない。
ホブ、2011

確かに、しかし、衝突はあなたに何をすべきかを教えてくれます:ただ他の人に話しかけるか、常により高い数を使ってください。覚えておいてください:数が壊れたビルドプロセスを魔法のように治すことはできません。それだけだリマインダーヒントあなたが何かをチェックする必要があること。
アーロンディグラ2011

1
ええ、そうです、魔法のbuildno.txtファイルは他のものと一緒にコミットされます。小規模なチーム、または並行ビルドを回避する大規模なチームに適したアプローチ。それがうまくいかないかもしれないと私が考えることができる唯一の場所は、ビルドプロセスを必要としないスクリプト言語(python)を使用する大規模なチーム(ビルドを行うために1人を割り当てるため)です。
ホブ、

3

弊社では、SVNからGitに移行しました。リビジョン番号の欠如は大きな問題でした!

Doをgit svn clone実行し、最後のSVNコミットにSVNリビジョン番号をタグ付けします。

export hr=`git svn find-rev HEAD`
git tag "$hr" -f HEAD

それからあなたは助けを借りてリビジョン番号を得ることができます

git describe --tags --long

このコマンドは次のようなものを提供します:

7603-3-g7f4610d

意味:最後のタグは7603です-SVNリビジョンです。3-それからのコミットの数です。追加する必要があります。

したがって、次のスクリプトでリビジョン番号をカウントできます。

expr $(git describe --tags --long | cut -d '-' -f 1) + $(git describe --tags --long | cut -d '-' -f 2)

1

私が使用していたものは:

git log | grep "^commit" | wc -l

シンプルですがうまくいきました。


4
"commit"で始まる1行のコミットメッセージ行がカウントを中断します。例:「私は偶然ncommit \最後に押されていること間違いや壊れたテストの修正」
パヴェルPolewicz

1

Bash構文を使用して、

$(git rev-list --count HEAD)

純粋に線形の履歴には問題ありません。ブランチからの「番号」も(に基づいてmaster)保持したい場合は、次のことを考慮してください。

$(git rev-list --count $(git merge-base master HEAD)).$(git rev-list --count ^master HEAD)

のチェックアウトから実行するとmaster、簡単に取得できます1234.0。ブランチのチェックアウトから実行すると、1234.13そのブランチで13回のコミットが行われた場合、のような結果になります。明らかに、これは特定のmasterリビジョンから最大で1つのブランチをベースにしている場合にのみ有用です。

--first-parent おそらく必要ではないが、他のブランチをマージすることのみから生じる一部のコミットを抑制するためにマイクロ番号に追加することができる。


1

あなたが試すことができます

git log --oneline | wc -l

または、リポジトリに貢献している人が行ったすべてのコミットを一覧表示する

git shortlog -s


0

このようにgit shortlogを使用してください

git shortlog -sn

または、エイリアスを作成します(ZSHベースの端末の場合)

# show contributors by commits alias gcall="git shortlog -sn"


0

作るのはaliasどうですか?

alias gc="git rev-list --all --count"      #Or whatever name you wish
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.