【问题标题】:Is there a way to make git auto generate a version number file for a --version option?有没有办法让 git 为 --version 选项自动生成版本号文件?
【发布时间】:2016-02-02 13:06:30
【问题描述】:

我有一个项目即将结束 Alpha 阶段,我已准备好开始定期发布。我知道 GitHub 有一个“神奇”的发布按钮,但我通常不喜欢那些我不知道它们具体做什么的“神奇”功能:

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

据我所知,GitHub 上的这个“神奇”发布功能只是在源存储库中为代码的特定状态创建一个标签或使用现有标签。根据该链接,标签名称必须反映语义版本号,即 Major.Minor.Patch ex: v10.1.2 或类似的东西。

一般来说,公认的 Git 发布方式似乎是简单地创建标签。我想做的是让 Git 在我的代码树中自动创建某种文件,名为 version.txtversion.h 文件,其中包含我创建了 git 标记,以便当用户在命令行上发出 myporgram --version 时可以自动获取此文件。最好我想要一个自动生成的头文件,因为它会在构建程序时集成到二进制文件中。有什么方法可以自动执行此操作,还是我必须在发出 git tag 命令之前自动将标签号通过管道传输到文件中?

【问题讨论】:

    标签: git github version command-line-arguments versioning


    【解决方案1】:

    我知道这个问题很老,但我只是遇到了它,因为我正在尝试做同样的事情。这里的另一个答案显示了如何在每次版本文件更改时创建一个新的 Git 标签,但我和 OP 想要做相反的事情:每次我为“释放”。以下是我在 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;
    }
    

    其次,创建一个 pre-commit 钩子 (.git/hooks/pre-commit),使用 git describe 的输出生成定义常量的相应 .cpp 文件:

    #!/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 文件的更新版本将作为提交的一部分包含在内,因此任何基于新标签的提交也将包含一个常量文件,反映该标签中的版本。

    这并不完美,因为它需要您创建一个新的提交来更新常量文件,即使您想要做的只是创建一个新标签(否则不需要新的提交)。另一方面,它确实允许您的代码内版本号跟踪提交的数量,这比单独的标记版本更细。

    【讨论】:

    • 我也做了同样的事情。但不是在 .git/hooks 中,而是在 CmakeList.txt 中,如果提交在构建时更改,我会检查并更改文件。因为我忽略了版本文件。它是完美的,只要有人用 git 而不是 zip 构建它。
    【解决方案2】:

    在这里查看不错的解决方案:https://coderwall.com/p/mk18zq/automatic-git-version-tagging-for-npm-modules

    基本上反其道而行之。创建文本文件或头文件。可以说:Version.h:

    #define VERSION 10.1.2
    

    并创建 post-commit 钩子来查找文件中的更改。部署:修改版本并提交文件。钩子会创建一个匹配的标签。

    【讨论】:

    • 可以反过来做吗?提交后挂钩可以使用递增的版本号或只是提交号来更新文本文件吗?
    猜你喜欢
    • 2019-10-15
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2021-08-03
    • 2019-03-03
    • 2013-10-19
    相关资源
    最近更新 更多