分散バージョン管理を使用する場合のビルド シーケンス
-
02-07-2019 - |
質問
現在、バージョン管理に Perforce を使用しています。これには、ビルドを参照するために使用できる、厳密に増加する変更番号という便利な機能があります (たとえば、「ビルドが少なくとも 44902 であればバグ修正が得られます」)。
ブランチや在宅勤務を容易にするために、分散システム (おそらく git) の使用に切り替えたいと考えています。(どちらも Perforce では完全に可能ですが、git ワークフローにはいくつかの利点があります。) そのため、「トリビュータリー開発」は分散され、共通のリビジョン シーケンスを参照しませんが、すべての変更が反映されるマスター git リポジトリを維持します。ビルドが作成される前にフィードする必要があります。
増加するビルド ID を厳密に保持する最善の方法は何ですか?私が思いつく最も簡単な方法は、マスター リポジトリが更新されるたびに起動するある種のコミット後フックを用意し、新しいツリー オブジェクト (またはコミット オブジェクト?) を登録することです。ID を配布する集中データベースを使用する git) は初めてです。(「データベース」と言っていますが、おそらく git タグを使用して、次に利用可能なタグ番号か何かを探すと思います。したがって、「データベース」は実際には .git/refs/tags/build-id/ になります。)
これは実行可能ですが、これを達成するためのより簡単な方法、すでに実装されている方法、または標準/「ベスト プラクティス」の方法があるかどうか疑問に思っています。
解決
私は次の使用提案をします git describe
. 。健全なバージョン管理ポリシーがあり、リポジトリでおかしなことをしていない場合、 git describe
は常に単調であり (リビジョン履歴がツリーではなく DAG である場合には、少なくとも可能な限り単調に)、一意です。
ちょっとしたデモンストレーション:
git init
git commit --allow-empty -m'Commit One.'
git tag -a -m'Tag One.' 1.2.3
git describe # => 1.2.3
git commit --allow-empty -m'Commit Two.'
git describe # => 1.2.3-1-gaac161d
git commit --allow-empty -m'Commit Three.'
git describe # => 1.2.3-2-g462715d
git tag -a -m'Tag Two.' 2.0.0
git describe # => 2.0.0
の出力 git describe
次のコンポーネントで構成されます。
- 説明を求めているコミットから到達可能な最新のタグ
- コミットとタグの間のコミット数 (ゼロ以外の場合)
- コミットの(短縮された)ID(#2 がゼロ以外の場合)
#2 は出力を単調にするもので、#3 は出力を独特にするものです。#2と#3はコミット時に省略されます。 は タグ、作成 git describe
製品リリースにも適しています。
他のヒント
現在のコミットに対応する単調増加する数値は、次のように生成できます。
git log --pretty=oneline | wc -l
単一の数値を返します。現在の sha1 をその番号に追加して、一意性を高めることもできます。
このアプローチはより優れています git describe
, タグを追加する必要がなく、マージが自動的に処理されるためです。
リベースに問題がある可能性がありますが、とにかくリベースは「危険」な操作です。
git rev-list BRANCHNAME --count
これは、リソースの消費量がはるかに少ないです
git log --pretty=oneline | wc -l
git tag
必要なものには十分かもしれません。それ以外の場合は使用しないことに誰もが同意するタグ形式を選択してください。
注記:ローカルでタグ付けすると、 git push
サーバー上のタグは更新されません。使用 git push --tags
そのために。
調べたほうがいいよ git describe
. 。これは、最新の注釈付きタグ、そのタグ以降のコミット数、およびブランチの先頭の短縮コミット ID に関して現在のブランチ (または渡されたコミット ID) を説明する一意の文字列を提供します。
おそらく、制御されたビルド リリースを実行する単一のブランチがあると思われます。この場合、既知のタグ形式で初期のコミットにタグを付けてから、 --match オプションを指定して git description を使用して、既知のタグに関連する現在の HEAD を記述します。git description の結果をそのまま使用することも、本当に 1 つの数値だけが必要な場合は、正規表現を使用してタグから数値を切り出すこともできます。
ブランチを決して巻き戻さないと仮定すると、後続のコミットの数によって常にブランチの履歴の一意のポイントが特定されます。
例えば(bash などを使用)
# make an annotated tag to an early build in the repository:
git tag -a build-origin "$some_old_commitid"
# describe the current HEAD against this tag and pull out a build number
expr "$(git describe --match build-origin)" : 'build-origin-\([0-9]*\)-g'
私は「ラベル」を使用します。ビルドが成功したとき (または失敗したときも) ラベルを作成すると、そのビルドを永久に識別できるようになります。まったく同じではありませんが、分散開発の利点を提供しながら、これらのビルド番号を提供します。
おそらくご存知のとおり、git は履歴のノードを一意に識別するハッシュ (数値) を計算します。厳密には増えていませんが、これらを利用するだけでも十分良さそうです。(さらに良いことに、彼らは いつも これらは大きな数字ですが、ほとんどの場合、先頭の 6 桁程度で対応できます。
例えば、
そのバグは 064f2ea で修正されました...
Mercurial では、次のコマンドを使用できます。
# get the parents id, the local revision number and the tags
[yjost@myhost:~/my-repo]$ hg id -nibt
03b6399bc32b+ 23716+ default tip
見る 特定する