web-dev-qa-db-ja.com

gitに--versionオプションのバージョン番号ファイルを自動生成させる方法はありますか?

アルファ段階から移行しつつあり、定期的にリリースを開始する準備ができているプロジェクトがあります。私はGitHubに「マジック」リリースボタンがあることを知っていますが、私は一般に、それらが何をするのか正確に知らない「マジック」機能が好きではありません。

https://github.com/blog/1547-release-your-software

私の知る限り、GitHubのこの「マジック」リリース機能は、コードの特定の状態のソースリポジトリにタグを作成するか、既存のタグを使用します。そのリンクによると、タグ名はセマンティックバージョン番号、つまりMajor.Minor.Patch ex:v10.1.2などを反映している必要があります。

一般に、リリースを行うために受け入れられているGitの方法は、単にタグを作成することです。 Gitがコードツリーにversion.txtまたはversion.hという名前のファイルを自動的に作成し、ユーザーがコマンドラインでmyporgram --versionを発行したときにこのファイルが自動的に読み込まれるように作成したgitタグ。プログラムのビルド時にバイナリに統合されるので、自動生成されたヘッダーファイルが望ましいです。これを自動的に行う方法はありますか、またはgit tagコマンドを発行する前にタグ番号をファイルに自動的にパイプする必要がありますか?

16
os x nerd

ここでニースのソリューションを参照してください: https://coderwall.com/p/mk18zq/automatic-git-version-tagging-for-npm-modules

基本的にそれを逆に行います。テキストファイルまたはヘッダーファイルを作成します。言うことができます:Version.h:

#define VERSION 10.1.2

そして、ファイルの変更を探すpost-commitフックを作成します。デプロイするには、バージョンを変更してファイルをコミットします。フックは一致するタグを作成します。

7
Igal S.

私はこの質問が古いことを知っていますが、同じことをやろうとしているので、私はそれを見つけました。ここでのもう1つの答えは、バージョンファイルが変更されるたびに新しいGitタグを作成する方法を示していますが、私とOPは逆にしたいと考えています。新しいGitタグを作成するたびに新しいバージョン番号を含むようにコードファイルを更新「リリース」。これが私のC++プロジェクトでの方法です。

まず、いくつかの定数を定義する、たとえばinclude/myproj/git_version.hppというヘッダーファイルを作成します。

#pragma once
namespace myproject {
extern const int MAJOR_VERSION;
extern const int MINOR_VERSION;
extern const int PATCH_VERSION;
extern const int COMMITS_AHEAD_OF_VERSION;
extern const char* VERSION_STRING;
extern const char* VERSION_STRING_PLUS_COMMITS;
}

次に、.git/hooks/pre-commitの出力を使用して、定数を定義する対応する.cppファイルを生成するpre-commitフック(git describe)を作成します。

#!/bin/bash

version_regex='v([0-9]+)\.([0-9]+)\.?([0-9]*)-([0-9]+)-g([0-9|a-z]+)'
git_string=$(git describe --tags --long)

if [[ $git_string =~ $version_regex ]]; then
    major_version="${BASH_REMATCH[1]}"
    minor_version="${BASH_REMATCH[2]}"
    patch_version="${BASH_REMATCH[3]}"
    commits_ahead="${BASH_REMATCH[4]}"
else
    echo "Error: git describe did not output a valid version string. Unable to update git_version.cpp" >&2
    exit 1
fi

version_num="${major_version}.${minor_version}.${patch_version}"
version_num_plus_commits="${version_num}+${commits_ahead}"

# Working directory of a git hook is always the root of the repo
cat > $(pwd)/src/git_version.cpp <<EOM
#include <myproject/git_version.hpp>

namespace myproject {
const int MAJOR_VERSION = $major_version;
const int MINOR_VERSION = $minor_version;
const int PATCH_VERSION = $patch_version;
const int COMMITS_AHEAD_OF_VERSION = $commits_ahead;
const char* VERSION_STRING = "${version_num}";
const char* VERSION_STRING_PLUS_COMMITS = "${version_num_plus_commits}";
}
EOM

git add $(pwd)/src/git_version.cpp

Git_constants.cppファイルの更新されたバージョンはコミットの一部として含まれるため、新しいタグに基づくコミットには、そのタグのバージョンを反映する定数ファイルも含まれることに注意してください。

これは完璧ではありません。新しいタグを作成するだけでも、定数ファイルを更新するために新しいコミットを作成する必要があるためです(そうでなければ、新しいコミットは必要ありません)。一方、コード内のバージョン番号でコミットの数を追跡できます。これは、タグ付きバージョンのみの場合よりもきめ細かくできます。

1
Edward