[解決済み] Gitでバージョン番号を管理するには?
質問
ここでは
blerp
でメンテナンスされているコマンドラインツールを想像してみましょう。
git
. このツールは、(非表示の)
--version
オプションがあり、その
バージョン
(仮に
0.1.2
とします)、そして別の
--commit
で、これはビルド元のコミット番号を返します。
バージョンとコミット番号の両方がコードベースにハードコードされています。
今、私はバグフィックスを行い、コミットしてプログラムをリビルドします。このとき、まだ
0.1.2
が表示されますが、この新しいバージョンはオリジナルの 0.1.2 とは異なっています。コミットによってのみ、それが同じ0.1.2ではないことがわかります。そのバグフィックスは異なるバージョン番号に値するのでしょうか?
1 つの解決策は、私がコミットするたびに、ハードコードされたバージョン番号を増やすことです (これは、コミットごとに最低 2 ファイルを常に変更することを意味します)。これは拘束力のある解決策であり、開発者が異なるアクティブなブランチで作業しているときには機能しません。もしボブが機能
foo
をバージョン
0.1.2
で、アリスは機能
bar
を同じバージョンから作成します。彼らはどのようにしてバージョン番号を増やすのでしょうか? ボブは奇数を、アリスは偶数を使うことができます。Eveが3つ目の機能で動く場合はどうでしょうか?
もう一つの解決策は、バージョン番号を自動的に生成するためにGitタグを使うことです。スクリプトは、最も近いタグを見つけることができます。
v
で始まる最も近いタグを見つけることができます。
v0.1.2
で、タグ名をバージョン番号に現在のコミットの最初のn桁を足したもの(
v0.1.2 (build 4acd21)
). これは、作業ディレクトリがクリーンである場合にうまく機能します。ある人は
*
をビルド番号の前に追加して、作業ディレクトリがクリーンでないことを示すこともできます。この方法の主な問題は、誰かがソースをエクスポートした場合、 そのソースでは
blerp
.
この問題を解決するために、どのような代替案が考えられるでしょうか。
どのように解決するのですか?
Alexey KiselevとDarioがすでに答えを提示していますが、私が詳しく説明します。
バージョン管理スキーム
バージョニング方式には2種類あります。
- 内部バージョン番号。これは一日に何度も増加させることができます (例: リビジョン管理番号)
- リリースされたバージョン。これはあまり頻繁に変更されません (例: セマンティックバージョニング)
人々が使う 異なるスキーム を使いますが セマンティックバージョニング はかなり広く使われており、GitHub の共同創設者である Tom Preston-Werner が執筆しています。
セマンティック・バージョニング
セマンティックバージョニングは、以下のパターンに従います。
X.Y.Z
あるいは、より読みやすいのは
[major].[minor].[patch]-[build/beta/rc]
例えば
1.2.0-beta
major or X
は、下位互換性のない API のリリースなど、ソフトウェアに大きな変更があった場合にインクリメントされる可能性があります。
minor or Y
は後方互換性のある API が導入された場合、インクリメントされます。
patch or Z
はバグフィックスの後にインクリメントされます。
Gitを使ってどのように実現するのでしょうか。
タグを使うことで、です。
Gitのタグは、バージョン番号を追加するために使用することができます。
git tag -a "v1.5.0-beta" -m "version v1.5.0-beta"
は、現在の Git リポジトリに v1.5.0-beta というバージョンタグを追加します。これ以降の新しいコミットには、コミット番号とコミットハッシュが追加され、タグが自動でインクリメントされます。これは
git describe
コマンドで確認できます。
v1.5.0-beta-1-g0c4f33f
ここで
-1-
はコミット番号で
0c4f33f
はコミットのハッシュの省略形です。また
g
という接頭辞は
"git"
.
完全な詳細は、以下を使用して表示できます。
git show v1.5.0-beta
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
gitlab をアップロード ! [リモート拒否] dev -> dev (受信前のフックが拒否されました)
-
git pull エラー: .git/FETCH_HEAD を開けない: パーミッションが拒否されました。
-
hint: 現在のブランチの先端が hint: そのリモートカウントより遅れているため、更新が拒否されました。
-
gitの利用(ssh鍵の作成とgithubの利用)。
-
git のコンパイルとインストールの問題を解決する fatal: https のリモートヘルパーが見つからない
-
[解決済み] Jenkins Pipeline Git SCM を認証情報でチェックアウトする?
-
[解決済み] JenkinsのGitプラグイン。特定のタグをビルドするには?
-
[解決済み] GitHubで、既存のレポを追加するときにすべてのブランチをプッシュするにはどうしたらいいですか?
-
[解決済み] バージョン管理には、なぜタグとリリース/ベータブランチを使い分ける必要があるのでしょうか?
-
[解決済み] SourceTreeを使用して、ビットバケット上にレポを作成せずに、ローカルレポをビットバケットにプッシュするにはどうすればよいですか?