首页 > 解决方案 > git SHA 可以作为电子设备软件版本的一部分显示吗

问题描述

我想使用并显示一个相当标准的语义版本控制 MM.mm.bb = (M)ajor.(m)inor.(b)uild,但理想情况下我想要计算机生成的东西,因为我不想自动- 由于此设备的特殊性,增加内部版本号。

我正在考虑尝试包含 git SHA,但当然 SHA 在您形成提交之前不会输出。

在软件构建版本中包含 SHA 是否可能/合理(例如:MM.mm.bb-f9a8e8)?

鉴于我不想自动增加内部版本号并且不想添加除 git 之外的其他 SHA 计算,有没有更好的方法来做到这一点?

标签: gitversionsha

解决方案


正如我在评论中指出的那样,Linux 内核可以解决问题。主要部分是setlocalversion脚本,核心部分是(详细解释在原脚本里面,下面只是关键部分)

    if test -z "$(git rev-parse --show-cdup 2>/dev/null)" &&
       head=$(git rev-parse --verify --short HEAD 2>/dev/null); then
            if [ -z "$(git describe --exact-match 2>/dev/null)" ]; then
                    printf '%s%s' -g $head
            fi

            if {
                    git --no-optional-locks status -uno --porcelain 2>/dev/null ||
                    git diff-index --name-only HEAD
            } | grep -qvE '^(.. )?scripts/package'; then
                    printf '%s' -dirty
            fi
    fi

现在我们的 C 文件module.c

#include <stdio.h>

#include "version.h"

int main(int argc, char *argv[])
{
    printf("Our version is: %s\n", VERSION);
    return 0;
}

Makefile

VERSION = 0.1

version.h: FORCE
    @echo "$(VERSION)$(shell $(PWD)/setlocalversion $(PWD))"
    @echo "#define VERSION \"$(VERSION)$(shell $(PWD)/setlocalversion $(PWD))\"" > version.h


module.o: version.h

all: module
    @$(PWD)/module

clean:
    @rm module module.o version.h

FORCE:

.PHONY: FORCE

开演时间:

$ make all
0.1-gb6d5c80
cc    -c -o module.o module.c
cc   module.o   -o module
Our version is: 0.1-gb6d5c80

推荐阅读