3

我正在尝试使用 NAnt 任务设置构建服务器。我有几个想要构建的 Git 存储库,但是我在结果的版本控制方面遇到了问题。

如何对库 (dll) 进行版本控制,以便每个构建都为每个版本使用一个数字?我知道 Git 没有像 SVN 这样的修订号,而是某种哈希。我想过使用提交日期。我只会在中央服务器上构建主服务器,因此所有提交都会增加(合并日期)。

如果我能得到日期的整数表示,我可以使用它(YYMMDD)。

现在我将使用 NAnt 来做所有很酷的事情 :),Git 是否提供了一种获取最新提交日期的方法?

4

3 回答 3

4

你要

git log -1 --pretty=format:%cd HEAD

头部是可选的。如果未指定,则推断。

于 2012-06-27T22:11:11.627 回答
3

这为您提供了最新提交(即 HEAD)的提交时间作为 UNIX 时间戳(自纪元以来的秒数,即 1970 年 1 月 1 日的 00:00:00 UTC),这应该是您想要的:

% git show -s --format='format:%ct' HEAD
1334298121

然后,您可以使用 date 将其转换为您提到的 YYMMDD 格式,并添加其他内容:

% date -r `git show -s --format='format:%ct' HEAD` +"foobar-%C%y%m%d.zip"
foobar-20120413.zip

(我在前面添加了世纪,%C因为这似乎是明智的做法,但您当然可以省略它。andfoobar只是.zip有关如何直接生成文件名的示例。)

您还可以选择其他一些格式,详细信息请参见git show --help

% git show -s --format='format:%cd' HEAD
Fri Apr 13 14:22:01 2012 +0800
% git show -s --format='format:%cD' HEAD
Fri, 13 Apr 2012 14:22:01 +0800
% git show -s --format='format:%cr' HEAD
3 months ago
% git show -s --format='format:%ct' HEAD
1334298121
% git show -s --format='format:%ci' HEAD
2012-04-13 14:22:01 +0800
于 2012-06-27T22:11:38.817 回答
3

我知道这不是您所要求的,但是如果您确实想使用版本号,那么 git-describe 是一个选项。

我用它来为我的库和程序提供版本信息。由于我使用版本格式X.Y.Z,因此 git-describe 非常适合我。它还有一个额外的好处,就是还为我提供了最新提交的提交 ID,所以我总是可以准确地知道库/程序在源历史记录中的哪一点被编译。

要使用 git-describe,您必须使用签名标签。创建标签时,我使用vX.Y. 然后 git-describe 将使用以下格式附加补丁和提交信息,vX.Y-Z-gC其中 X 是主要版本,Y 是次要版本,Z 是补丁级别,C 是 git 提交 ID。

例如,我创建一个提交:

$ git tag -s v0.2 -m "Creating release 0.2"
$ git tag
v0.0
v0.1
v0.2
$ git describe --long --abbrev=7
0.2.0.gbb871fd

然后,我可以使用以下命令导出具有补丁级别的版本:

GIT_DESCRIBE=`git describe --long --abbrev=7 |sed -e 's/-/./g' -e 's/^v//g'`
GIT_MAJOR=`echo ${GIT_DESCRIBE}  |cut -d. -f1`
GIT_MINOR=`echo ${GIT_DESCRIBE}  |cut -d. -f2`
GIT_PATCH=`echo ${GIT_DESCRIBE}  |cut -d. -f3`
GIT_COMMIT=`echo ${GIT_DESCRIBE} |cut -d. -f4`

echo "${GIT_DESCRIBE}"
0.2.53.g00e0e11

echo "${GIT_MAJOR}.${GIT_MINOR}.${GIT_PATCH}.${GIT_COMMIT}"
0.2.53.g00e0e11

在上面的输出中,自最后一个标签创建以来已经有 53 次提交(已修补),并且00e0e11是修订历史中最新提交的部分提交 ID。

一旦我有了解析的版本信息,我就可以创建一个 C 头文件来定义在源代码中使用的版本号:

cat << EOF > lib_version.h
#undef MYLIB_VER_MAJOR
#undef MYLIB_VER_MINOR
#undef MYLIB_VER_PATCH
#undef MYLIB_VER_COMMIT
#undef MYLIB_VERSION
#define MYLIB_VER_MAJOR  ${GIT_MAJOR}
#define MYLIB_VER_MINOR  ${GIT_MINOR}
#define MYLIB_VER_PATCH  ${GIT_PATCH}
#define MYLIB_VER_COMMIT "${GIT_COMMIT}"
#define MYLIB_VERSION    "${GIT_DESCRIBE}"
EOF

我使用了与上述类似的技术,使用 autoconf(和朋友)和 Xcode 的外部构建目标(实际上是我所有的 iOS 应用程序的版本控制方式)在包中生成版本信息。

这是实现上述内容的真实示例(带有源代码):http: //bindle.github.com/LdapKit/请注意,版本信息出现在文档中,并且每次我重新生成文档时都会更新。

于 2012-06-27T22:21:38.747 回答