有没有办法让git自动为--version选项生成版本号文件?

os *_*erd 14 versioning git version github command-line-arguments

我有一个项目正在退出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命令之前是否必须自动将标记号管道传输到文件中?

Iga*_* S. 7

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

基本上反过来做.创建文本文件或头文件.让我们说:Version.h:

#define VERSION 10.1.2
Run Code Online (Sandbox Code Playgroud)

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

  • 这可以反过来做吗?post-commit钩子是否可以使用递增的版本号或简单的提交号更新文本文件? (8认同)

Edw*_*ard 5

我知道这个问题很老,但我刚刚遇到它,因为我正在尝试做同样的事情。这里的另一个答案显示了如何在每次版本文件更改时创建一个新的 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;
}
Run Code Online (Sandbox Code Playgroud)

其次,使用以下输出创建一个预提交钩子 ( .git/hooks/pre-commit),以生成定义常量的相应 .cpp 文件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
Run Code Online (Sandbox Code Playgroud)

请注意,git_constants.cpp 文件的更新版本将作为提交的一部分包含在内,因此任何基于新标签的提交也将包含一个反映该标签中版本的常量文件。

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