19

私がいる Git ブランチ名 (ビルド時) と、ブランチが分岐してからのコミット数から自動的に派生するアプリケーション ビルド バージョンを構成したいと考えています。これは、私の Git リポジトリのどのコミットでも一意になると思いますか? ブランチ名は一意であり、コミットはブランチに沿って互いにリンクされていますか? コミットにタグを付ける場合、そのタグをバージョンの前に付けることができます。

ある意味git describeで私が望むことをしますが、私がいるブランチ名は含まれておらず、短縮されたコミット SHA-1 ハッシュが含まれています。これは、文字列のエントロピーに何も追加しないため、必要ないと思います冗長な場合があります(ここで間違っている可能性があるため、修正してください)。

私のオプションは何ですか?そして、私はここで正しい方向に考えていますか? ソフトウェア開発に関して、より重要な処理を行う必要があるときに、バージョンに番号を追加することに少しうんざりしています。

ちなみに、私は汚い作業ツリーでビルドすることはありません。つまり、公開リリースをビルドする前に、常に変更をリポジトリにコミットします。

4

4 に答える 4

12

これが私が使用するものです:

echo "`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`"

次のようなものが生成されます。

master-6de772e

アリストテレスが指摘したように、実際には SHA-1 だけで、明確なビルド タグと、開発の歴史的コンテキストに関する完全な情報を提供するのに必要かつ十分です。それらが提供する情報は SHA-1 から把握または導出できるという意味で、他のすべては冗長です。ただし、人間は、実際のブランチの補足的なコンテキスト情報もすぐに明らかになる可能性があり (または、少なくともこの人間はそうします)、ブランチ名をラベルに埋め込むことを好みます。この理由から (つまり、情報を人間が即座に解析するため)、私のプロジェクトのほとんどは、ビルド ID の「ラベル」に加えて、ビルドが基づいたコミットの日付と時刻を含む、より長いビルド ID の「説明」も使用します。上記のとおりです。

于 2010-07-25T17:06:38.017 に答える
12

git について理解しておく必要があるのは、ブランチは本質的に単なるコミット ブックマークに過ぎないということです。fooコミットを行ったときにブランチにいたという事実は0deadbeef、コミット自体には重要ではありません。ブランチはそのアイデンティティの一部ではありません。

(Mercurial はブランチ名をコミットに焼き付けます。Dustin Sallings が説明しているように、さまざまな点でこれは劣っています。)

それが現在チェックアウトされているブランチを使用するだけであると仮定してもgit describe、マージ履歴がある場合、使用する同じ最新のタグ付きコミットにつながる複数のパスが存在する可能性がありgit describeます。そのため、必ずしも1 つのブランチがあるとは限りません。

別の注意: 「タグ X からの 3 番目のコミット」が一般的に曖昧である場合でもgit describe、グラフを見てあいまいかどうかを判断しそうでない場合はハッシュを除外することに反対するかもしれません。ただし、後でそのタグの上にブランチを開始する人を止めるものは何もありません。そのため、文字列は遡及的describeにあいまいになります。

要するに、コミットの唯一の明確な識別子はそのハッシュです。だからそこにあるに違いない。Gitモデルの範囲内で、人間が自分自身を方向付けるような空間的/リレーショナルな理解に説明をより役立つようにする、冗長な(そしてコミット番号の場合はあいまいな)情報を追加git describeます。

于 2010-07-21T21:02:11.317 に答える
7

公式リリースには、バージョン番号が記載されたタグが必要です。この場合、次のアプローチをお勧めします。

  1. 現在のコミットにタグがある場合は、そのタグを使用します
  2. 使用可能なタグがない場合は、ブランチ名とSHA1-キーを使用します

この単一のコマンドは機能するはずです:

git describe --exact-match 2> /dev/null || echo "`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`"
于 2011-12-02T15:03:30.983 に答える
6

git describe --long常に次のようなバージョン番号を出力します: v1.2-10-gdeadbee 。これは、短縮された SHA-1 'deadbee' でコミットを指す注釈付きタグ 'v1.2'から 10 回目のコミットを意味します。したがって、ブランチの開始 (ブランチの分岐点) にタグを付けるだけです。<branch>-start

「タグ 'x' からの 3 回目のコミット」(たとえば) はコミットを一意に区別しないため、あいまいな状況を区別するには、省略されたコミット SHA-1 ハッシュが必要です。非線形で枝分かれした開発が存在する場合、前述の説明に適合するコミットが複数存在する可能性があります。たとえば、以下の ASCII アート図に示されている状況では、* でマークされた両方のコミットが「タグ 'x' からの 3 回目のコミット」の説明に適合します。

          /-.---*---.-\                   
         / \                  
.---x---.---.---*---.---M---. <--- ブランチ

上記の「マージされた」ケースでは、ブランチ名を使用して、同じ説明を持つ 2 つのコミットを区別できないことに注意してください。

したがって、あなたがしなければならないことは、git describe --long出力を取得し(--longオプションは解析のあいまいさを避けるためにここにあります。git describe manpageを参照してください)、それを解析し、現在のブランチ情報を追加します(出力のパージングからgit symbolic-ref HEADはなくgit branch、たとえばから)。

于 2010-07-21T17:30:52.493 に答える