什么是Git修订版本号?


244

我们在工作中使用SVN,但是对于我的个人项目,我决定使用Git。所以我昨天安装了Git,不知道Git中的等效修订号多少

假设我们正在使用3.0.8版,并且每个Bug修复都有其自己的修订号,在我们讨论此Bug修复时可以使用。因此,如果我将Git中的代码标记为3.0.8,那么可以用作修订号或其他更详细的标识吗?我发现哈希对人类不是那么用户友好。



一篇文章介绍了一种可能的解决方案。它可能看起来有点沉重,但集成到“ git log”输出中,除了“ git push / pull / fetch”外,不需要其他命令。
德米特里·帕夫连科

不幸的是,@ DmitryPavlenko的链接文章位于无效域中:gitsvn.x10.mx。在没有任何主题指示的情况下,任何人都很难在其他地方找到它。
Michael Donohue 2014年

注意:git不再需要缩写说明:请参见stackoverflow.com/a/41308073/6309
VonC

1
不,Laurence Gonsalves,这不是“如何获取git commit计数?”的重复。-这是关于版本号的,即使提交计数可以看起来有点像-哈希版本与提交计数也有很大不同:-)
David Svarrer

Answers:


149

对您来说是好消息还是坏消息,该哈希是修订号。当我从SVN切换到git时,我也遇到了麻烦。

您可以在git中使用“标记”将某个修订标记为特定版本的“发行版”,从而可以轻松引用该修订。查看此博客文章

要了解的关键是git不能有修订号-考虑分散的性质。如果用户A和B都提交到其本地存储库,那么git如何合理地分配一个顺序修订版本号?在推/拉彼此的更改之前,A不了解B。

要查看的另一件事是错误修正分支的简化分支:

从发布开始:3.0.8。然后,在该发行版之后,执行以下操作:

git branch bugfixes308

这将为错误修正创建一个分支。结帐分支:

git checkout bugfixes308

现在进行所需的任何错误修正。

git commit -a

提交它们,然后切换回master分支:

git checkout master

然后从另一个分支拉入那些更改:

git merge bugfixes308

这样,您就有了一个单独的特定于发行版的错误修正分支,但是您仍将错误修正更改拉入主开发人员主干。


11
我知道哈希是修订版本号,但我希望它不是:-)))谢谢您的很好的解释和建议。
Radek

3
别客气。当我第一次从SVN拿起它时,我对git感到非常沮丧,但现在我又
反过来了

4
另外,自从我发布此消息以来已经有一段时间了,但是请记住,您也可以单行执行“ git checkout -b new_branch_name”来执行“ git branch foo”和“ git checkout foo”。
makdad 2012年

1
我是否正确认为散列是“真实”散列,甚至不是远程顺序散列?因此,重要的是,如果错误数据库显示fixed in 547cc3e..c4b2eba,并且您有其他修订版本,则您不知道您的代码是否应该包含此修复程序?!git-central的gits当然可以解决这个问题吗?
奥利

3
在SVN中,在r42中已修复错误的事实并不能告诉您在实际使用分支后是否也在r43中也已修复了错误。
Matthieu Moy 2015年

186

使用现代的Git(以我的情况为1.8.3.4),不使用分支,您可以执行以下操作:

$ git rev-list --count HEAD
68

22
考虑使用git rev-list --count --first-parent HEAD
Flimm,2014年

8
给定此信息(数字68),是否有办法确定修订版本以重新获得代码?假设“修订版68”已发布到测试环境中,开发继续进行,后来开发人员需要从源代码管理中重新获取“修订版68”。他将如何定位要克隆的特定版本?还是我错过了一些有关Git的东西,使之不必要?
大卫

9
请记住,此解决方案对于不同的开发人员将产生不同的结果。另外,从“计数”到提交的反向计算将为不同的开发人员产生不同的提交!这是因为Git具有分布式特性,并且在同一时间段内,提交会在不同的存储库中发生,但git rev-list --count HEAD根据上一次执行推入和拉出的时间可能不计入。
杰森

2
@Jason,戴维(David)关于添加的评论 --first-parent解决您的问题吗?我不希望避免使用看似最简单的解决方案,因为如果有同样简单的解决方法或使它更强大的方法,那么这种情况很少见。
MarkHu '16

4
@MarkHu,有--first-parent帮助。只要不做任何基础调整,并且始终使用相同的分支进行发布(当然,还要计算该发布号),我认为可以使用它。虽然,我仍然不确定,它始终可以唯一地标识该发行版来自的提交。这里有太多事情可能会出错...但是目前,我无法想到肯定会破坏这一点的事情(考虑到我上面的“只要”声明)。的git describe在另一个答复中提到的方法是要走的路。如果您想要人类可读的内容,请创建一个标签。
杰森

104

git describe命令将创建一个更易于理解的名称,该名称引用了特定的提交。例如,从文档中:

使用git.git之类的当前树,我得到:

[torvalds@g5 git]$ git describe parent
v1.0.4-14-g2414721

也就是说,我的“父”分支的当前头基于v1.0.4,但是由于它上面还有一些提交,describe添加了额外的提交数量(“ 14”)和该提交的缩写对象名称本身(“ 2414721”)结尾。

只要使用合理命名的标签来标记特定的发行版,就可以认为它大致等效于SVN“修订号”。


7
我只想指出,当您的git存储库已具有标签时,此方法才有效。如果没有,您可能会得到git describe失败,并显示“致命:找不到名称,无法描述任何内容”。-堆栈溢出 ; 这意味着您必须自己设置标签。
sdaau

14
@sdaau:如果您正在脚本中使用此命令或其他内容,并且希望git describe永不失败,请使用该git describe --always选项。
Greg Hewgill

可以使用输出git describe以某种方式找到源提交吗?我的意思是没有手动计算日志中的提交。
Lii

@Lii:“源代码提交”是什么意思?最近的标记(v1.0.4)和最近的提交ID(2414721)都已成为git describe输出的一部分。
Greg Hewgill '18

@GregHewgill:是的,谢谢,当我问这个问题时,我没有意识到“缩写对象名称”是一个可以用来标识提交的值。太精彩了!
Lii

67

其他海报是正确的,没有“修订号”。

我认为最好的方法是使用“发布”标签!

但是我利用以下内容来伪造修订号(仅供客户查看修订和进度,因为他们希望从git到通过subversion使用相同的不断增加的修订)。

使用以下命令显示“ HEAD”的“当前修订版”:

git rev-list HEAD | wc -l

但是,如果客户告诉我“修订” 1302中存在错误,该怎么办?

为此,我在〜/ .gitconfig的[alias]部分添加了以下内容:

show-rev-number = !sh -c 'git rev-list --reverse HEAD | nl | awk \"{ if(\\$1 == "$0") { print \\$2 }}\"'

git show-rev-number 1302然后使用将打印哈希 “修订”:)

前一段时间,我写了一篇关于该“技术” 的博客文章(德语)


@Radek-“有时需要知道什么'代码更改=提交'修复了某些问题”-然后git bisect(link)是识别谁更改的内容的合适工具。
迈克尔2012年

@Radek是的,这个数字正在不断增加。它只计算您在HEAD上签入的修订。因此,每次提交都是一个新修订。这不适用于不同的分支机构。
OderWat 2012年

1
我喜欢你的解决方案。请注意,您可以简化它:show-rev-number =!sh -c'git rev-list --reverse HEAD | AWK NR == $ 0'
阿夫纳

@avner谢谢!很显然,我一生中没有使用过很多awk :)
OderWat 2012年

3
我不得不使用git rev-list --reverse HEAD | awk "{ print NR }" | tail -n 1
Gerry

27

Git与版本号没有相同的版本号概念。而是使用SHA1校验和来标记每个通过提交进行的给定快照。为什么?在分布式版本控制系统中运行revno存在一些问题:

首先,由于开发根本不是线性的,因此很难以满足程序员的需求的方式来解决数字的附加问题。当数字不符合您的预期时,尝试通过添加数字来解决此问题可能会很快成为问题。

其次,修订号可能在不同的机器上生成。这使得数字同步更加困难-尤其是因为连接是单向的;您甚至可能无法访问具有该存储库的所有计算机。

第三,在git中(由现已失效的OpenCM系统开创),提交的身份(提交是什么)等同于其名称(SHA ID)。这种命名=身份的概念非常强大。当您坐着提交名称时,它也以一种不可伪造的方式来标识该提交。这样一来,您就可以将所有提交重新检查到第一个初始提交,看是否损坏了。git fsck

现在,由于我们具有修订版的DAG(有向无环图),并且它们构成了当前树,因此我们需要一些工具来解决您的问题:我们如何区分不同的版本。首先,如果给定的前缀1516bd唯一地标识您的提交,则可以忽略哈希的一部分。但这也是人为的。相反,技巧是使用标签和/或分支。标签或分支类似于您附加到给定提交SHA1-id的“黄色便条纸”。从本质上讲,标记是不可移动的,而对它的HEAD进行新的提交时,分支将移动。有多种方法可以引用标记或分支周围的提交,请参见git-rev-parse的手册页。

通常,如果您需要处理特定的代码段,那么该代码段正在进行更改,因此应该是带有说法主题名称的分支。创建大量分支(每个程序员20-30个并非闻所未闻,出版了4-5个分支供其他人使用)是有效git的窍门。每一项工作都应从其自己的分支开始,然后在测试时合并到一起。未发布的分支可以完全重写,破坏历史的这一部分是git的力量。

当变更被接受后,它便会冻结并变成考古学。那时,您可以对其进行标记,但是更常见的是,通过sha1 sum在bug跟踪器或问题跟踪器中对特定提交进行引用。标记倾向于保留给版本颠簸和维护分支的分支点(对于旧版本)。


18

如果你有兴趣,我自动管理的版本号从git的相关信息在这里的格式下

<major>.<minor>.<patch>-b<build>

其中build是提交的总数。您会在中看到有趣的代码Makefile。这是访问版本号不同部分的相关部分:

LAST_TAG_COMMIT = $(shell git rev-list --tags --max-count=1)
LAST_TAG = $(shell git describe --tags $(LAST_TAG_COMMIT) )
TAG_PREFIX = "latex-tutorial-v"

VERSION  = $(shell head VERSION)
# OR try to guess directly from the last git tag
#VERSION    = $(shell  git describe --tags $(LAST_TAG_COMMIT) | sed "s/^$(TAG_PREFIX)//")
MAJOR      = $(shell echo $(VERSION) | sed "s/^\([0-9]*\).*/\1/")
MINOR      = $(shell echo $(VERSION) | sed "s/[0-9]*\.\([0-9]*\).*/\1/")
PATCH      = $(shell echo $(VERSION) | sed "s/[0-9]*\.[0-9]*\.\([0-9]*\).*/\1/")
# total number of commits       
BUILD      = $(shell git log --oneline | wc -l | sed -e "s/[ \t]*//g")

#REVISION   = $(shell git rev-list $(LAST_TAG).. --count)
#ROOTDIR    = $(shell git rev-parse --show-toplevel)
NEXT_MAJOR_VERSION = $(shell expr $(MAJOR) + 1).0.0-b$(BUILD)
NEXT_MINOR_VERSION = $(MAJOR).$(shell expr $(MINOR) + 1).0-b$(BUILD)
NEXT_PATCH_VERSION = $(MAJOR).$(MINOR).$(shell expr $(PATCH) + 1)-b$(BUILD)

9

Bash函数:

git_rev ()
{
    d=`date +%Y%m%d`
    c=`git rev-list --full-history --all --abbrev-commit | wc -l | sed -e 's/^ *//'`
    h=`git rev-list --full-history --all --abbrev-commit | head -1`
    echo ${c}:${h}:${d}
}

输出类似

$ git_rev
2:0f8e14e:20130220

那是

commit_count:last_abbrev_commit:date_YYmmdd

这种事情可能有用,但是如果对增量版本号感兴趣,他们会交换字段位置,因此(非增量)哈希值是最后的。
MarkHu '16

8

提交SHA1哈希等效于Subversion修订版号。


7
不幸的是,它具有与修订版本完全不同的属性。它相当长,并且不会单调增加。猜猜这就是分发的代价...
CodesInChaos

1
@CodeInChaos:我知道您要做什么,但是通常可以仅使用哈希码的前6个或8个字符来引用git commit。
克里斯·皮特曼

5
@Radek:不能保证它们是唯一的(尽管如果发现碰撞,您可以赢得一些名人)。
Slartibartfast

8
@Radek根据en.wikipedia.org/wiki/Collision_attack,使用4个字符的哈希值,您具有16位ID,这意味着在具有256(= 2 ^(16/2))的存储库中提交的数字为50两个提交具有相同的四个字符前缀的机会百分比(并且使用65536个提交是确定的,因为从那以后4字符ID的范围将被耗尽)。当添加一个字符时,您具有20位ID,这意味着50%的阈值是1024次提交。但是由于这是一个统计参数,所以不能保证此类冲突不会更早发生。
鲁迪,

2
由于哈希是基于内容的,因此两个提交是否具有相同的哈希前缀还是不确定性,这仍然是一个可能性。在65536次提交时,很有可能两个会具有相同的4个字符的前缀,但仍不确定。
顺便说一句

6

这是我在基于其他解决方案的makefile中所做的事情。请注意,这不仅为您的代码提供了修订号,而且还附加了允许您重新创建发行版的哈希。

# Set the source control revision similar to subversion to use in 'c'
# files as a define.
# You must build in the master branch otherwise the build branch will
# be prepended to the revision and/or "dirty" appended. This is to
# clearly ID developer builds.
REPO_REVISION_:=$(shell git rev-list HEAD --count)
BUILD_BRANCH:=$(shell git rev-parse --abbrev-ref HEAD)
BUILD_REV_ID:=$(shell git rev-parse HEAD)
BUILD_REV_ID_SHORT:=$(shell git describe --long --tags --dirty --always)
ifeq ($(BUILD_BRANCH), master)
REPO_REVISION:=$(REPO_REVISION_)_g$(BUILD_REV_ID_SHORT)
else
REPO_REVISION:=$(BUILD_BRANCH)_$(REPO_REVISION_)_r$(BUILD_REV_ID_SHORT)
endif
export REPO_REVISION
export BUILD_BRANCH
export BUILD_REV_ID

3
看来是最安全的使用方式 git-describe避免错误的方法是git describe --always --dirty --long --tags在我能想到的所有情况下使用该方法。
MarkHu '16

5

使用git hash作为内部版本号的问题在于它不会单调增加。OSGi建议使用时间戳作为内部版本号。看起来可以使用对分支的提交数来代替Subversion或perforce更改数。


5

我编写了一些PowerShell实用程序,用于从Git检索版本信息并简化标记

函数:Get-LastVersion,Get-Revision,Get-NextMajorVersion,Get-NextMinorVersion,TagNextMajorVersion,TagNextMinorVersion:

# Returns the last version by analysing existing tags,
# assumes an initial tag is present, and
# assumes tags are named v{major}.{minor}.[{revision}]
#
function Get-LastVersion(){
  $lastTagCommit = git rev-list --tags --max-count=1
  $lastTag = git describe --tags $lastTagCommit
  $tagPrefix = "v"
  $versionString = $lastTag -replace "$tagPrefix", ""
  Write-Host -NoNewline "last tagged commit "
  Write-Host -NoNewline -ForegroundColor "yellow" $lastTag
  Write-Host -NoNewline " revision "
  Write-Host -ForegroundColor "yellow" "$lastTagCommit"
  [reflection.assembly]::LoadWithPartialName("System.Version")

  $version = New-Object System.Version($versionString)
  return $version;
}

# Returns current revision by counting the number of commits to HEAD
function Get-Revision(){
   $lastTagCommit = git rev-list HEAD
   $revs  = git rev-list $lastTagCommit |  Measure-Object -Line
   return $revs.Lines
}

# Returns the next major version {major}.{minor}.{revision}
function Get-NextMajorVersion(){
    $version = Get-LastVersion;
    [reflection.assembly]::LoadWithPartialName("System.Version")
    [int] $major = $version.Major+1;
    $rev = Get-Revision
    $nextMajor = New-Object System.Version($major, 0, $rev);
    return $nextMajor;
}

# Returns the next minor version {major}.{minor}.{revision}
function Get-NextMinorVersion(){
    $version = Get-LastVersion;
    [reflection.assembly]::LoadWithPartialName("System.Version")
    [int] $minor = $version.Minor+1;
    $rev = Get-Revision
    $next = New-Object System.Version($version.Major, $minor, $rev);
    return $next;
}

# Creates a tag with the next minor version
function TagNextMinorVersion($tagMessage){
    $version = Get-NextMinorVersion;
    $tagName = "v{0}" -f "$version".Trim();
    Write-Host -NoNewline "Tagging next minor version to ";
    Write-Host -ForegroundColor DarkYellow "$tagName";
    git tag -a $tagName -m $tagMessage
}

# Creates a tag with the next major version (minor version starts again at 0)
function TagNextMajorVersion($tagMessage){
    $version = Get-NextMajorVersion;
    $tagName = "v{0}" -f "$version".Trim();
    Write-Host -NoNewline "Tagging next majo version to ";
    Write-Host -ForegroundColor DarkYellow "$tagName";
    git tag -a $tagName -m $tagMessage
}

4

每个提交都有一个唯一的哈希。除此之外,git中没有修订号。如果您想要更多的用户友好性,则必须自己标记提交。


3

我只想指出另一种可能的方法-那是使用git git-notes(1),自v 1.6.6(自-Git 注意)(我正在使用git -Git 1.7.9.5版)。

基本上,我曾经使用git svn线性历史记录克隆了SVN存储库(没有标准布局,没有分支,没有标签),并且我想比较克隆的git存储库中的修订号。默认情况下,此git克隆没有标签,因此我无法使用git describe。这里的策略可能仅适用于线性历史记录-不确定合并后的结果如何。但是这是基本策略:

  • 询问git rev-list所有提交历史记录的列表
    • 由于rev-list默认情况下按“倒序排列”,我们将使用其--reverse开关来获取提交列表,该列表按最早的顺序排列
  • 使用bash外壳
    • 在每次提交时增加一个计数器变量作为修订计数器,
    • 为每次提交生成并添加“临时” git注释
  • 然后,使用git log与浏览日志--notes,这也将转储提交的笔记,在这种情况下将是“修订号”
  • 完成后,删除临时注释(注意:我不确定这些注释是否已提交;它们并没有真正显示在git status

首先,请注意,它git具有便笺的默认位置-但您也可以ref为便笺指定一个(erence)-它将它们存储在.git; 下的另一个目录中。例如,在一个gitrepo文件夹中,您可以调用git notes get-ref以查看将在哪个目录中:

$ git notes get-ref
refs/notes/commits
$ git notes --ref=whatever get-ref
refs/notes/whatever

需要注意的是,如果您notes add使用--ref,则还必须再次使用该引用-否则可能会出现类似“找不到对象XXX的注释...。

对于此示例,我选择ref将注释的名称称为“ linrev”(用于线性修订)-这也意味着该过程不太可能会干扰已经存在的注释。我也正在使用该--git-dir开关,因为作为一个git新手,我在理解它时遇到了一些问题-所以我想“记住以备后用” :);并且我还使用--no-pager了抑制less使用时的生成git log

因此,假设您在目录中,并且有一个myrepo_git属于git存储库的子文件夹 ;一个可以做:

### check for already existing notes:

$ git --git-dir=./myrepo_git/.git notes show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
$ git --git-dir=./myrepo_git/.git notes --ref=linrev show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.

### iterate through rev-list three, oldest first,
### create a cmdline adding a revision count as note to each revision

$ ix=0; for ih in $(git --git-dir=./myrepo_git/.git rev-list --reverse HEAD); do \
  TCMD="git --git-dir=./myrepo_git/.git notes --ref linrev"; \
  TCMD="$TCMD add $ih -m \"(r$((++ix)))\""; \
  echo "$TCMD"; \
  eval "$TCMD"; \
done

# git --git-dir=./myrepo_git/.git notes --ref linrev add 6886bbb7be18e63fc4be68ba41917b48f02e09d7 -m "(r1)"
# git --git-dir=./myrepo_git/.git notes --ref linrev add f34910dbeeee33a40806d29dd956062d6ab3ad97 -m "(r2)"
# ...
# git --git-dir=./myrepo_git/.git notes --ref linrev add 04051f98ece25cff67e62d13c548dacbee6c1e33 -m "(r15)"

### check status - adding notes seem to not affect it:

$ cd myrepo_git/
$ git status
# # On branch master
# nothing to commit (working directory clean)
$ cd ../

### check notes again:

$ git --git-dir=./myrepo_git/.git notes show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
$ git --git-dir=./myrepo_git/.git notes --ref=linrev show
# (r15)

### note is saved - now let's issue a `git log` command, using a format string and notes:

$ git --git-dir=./myrepo_git/.git --no-pager log --notes=linrev --format=format:"%h: %an: %ad:  >>%s<< %N" HEAD
# 04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000:  >>test message 15 << (r15)
# 77f3902: _user_: Sun Apr 21 18:29:00 2013 +0000:  >>test message 14<< (r14)
# ...
# 6886bbb: _user_: Sun Apr 21 17:11:52 2013 +0000:  >>initial test message 1<< (r1)

### test git log with range:

$ git --git-dir=./myrepo_git/.git --no-pager log --notes=linrev --format=format:"%h: %an: %ad:  >>%s<< %N" HEAD^..HEAD
# 04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000:  >>test message 15 << (r15)

### erase notes - again must iterate through rev-list

$ ix=0; for ih in $(git --git-dir=./myrepo_git/.git rev-list --reverse HEAD); do \
  TCMD="git --git-dir=./myrepo_git/.git notes --ref linrev"; \
  TCMD="$TCMD remove $ih"; \
  echo "$TCMD"; \
  eval "$TCMD"; \
done
# git --git-dir=./myrepo_git/.git notes --ref linrev remove 6886bbb7be18e63fc4be68ba41917b48f02e09d7
# Removing note for object 6886bbb7be18e63fc4be68ba41917b48f02e09d7
# git --git-dir=./myrepo_git/.git notes --ref linrev remove f34910dbeeee33a40806d29dd956062d6ab3ad97
# Removing note for object f34910dbeeee33a40806d29dd956062d6ab3ad97
# ...
# git --git-dir=./myrepo_git/.git notes --ref linrev remove 04051f98ece25cff67e62d13c548dacbee6c1e33
# Removing note for object 04051f98ece25cff67e62d13c548dacbee6c1e33

### check notes again:

$ git --git-dir=./myrepo_git/.git notes show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
$ git --git-dir=./myrepo_git/.git notes --ref=linrev show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.

因此,至少在我没有分支的完全线性历史记录的特定情况下,修订版本号似乎与此方法匹配-此外,似乎这种方法将允许使用 git log修订范围,同时仍获得正确的修订版本-YMMV虽然有不同的背景

希望这对某人有帮助,
干杯!


编辑:好的,这有点容易,git上面循环的别名叫做setlinrevunsetlinrev;在git信息库文件夹中时,请执行以下操作(请注意令人讨厌的bash转义,另请参阅#16136745-添加包含分号的Git别名):

cat >> .git/config <<"EOF"
[alias]
  setlinrev = "!bash -c 'ix=0; for ih in $(git rev-list --reverse HEAD); do \n\
      TCMD=\"git notes --ref linrev\"; \n\
      TCMD=\"$TCMD add $ih -m \\\"(r\\$((++ix)))\\\"\"; \n\
      #echo \"$TCMD\"; \n\
      eval \"$TCMD\"; \n\
    done; \n\
    echo \"Linear revision notes are set.\" '"

  unsetlinrev = "!bash -c 'ix=0; for ih in $(git rev-list --reverse HEAD); do \n\
      TCMD=\"git notes --ref linrev\"; \n\
      TCMD=\"$TCMD remove $ih\"; \n\
      #echo \"$TCMD\"; \n\
      eval \"$TCMD 2>/dev/null\"; \n\
    done; \n\
    echo \"Linear revision notes are unset.\" '"
EOF

...因此您可以git setlinrev在尝试进行涉及线性修订说明的日志之前简单地调用它;并git unsetlinrev在完成后删除这些注释;git repo目录中的一个示例:

$ git log --notes=linrev --format=format:"%h: %an: %ad:  >>%s<< %N" HEAD^..HEAD
04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000:  >>test message 15 <<

$ git setlinrev
Linear revision notes are set.
$ git log --notes=linrev --format=format:"%h: %an: %ad:  >>%s<< %N" HEAD^..HEAD
04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000:  >>test message 15 << (r15)
$ git unsetlinrev
Linear revision notes are unset.

$ git log --notes=linrev --format=format:"%h: %an: %ad:  >>%s<< %N" HEAD^..HEAD
04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000:  >>test message 15 <<

Shell完成这些别名所需的时间,取决于存储库历史记录的大小。


2

对于具有Ant构建过程的人员,您可以使用以下目标在git上为项目生成版本号:

<target name="generate-version">

    <exec executable="git" outputproperty="version.revisions">
        <arg value="log"/>
        <arg value="--oneline"/>
    </exec>

    <resourcecount property="version.revision" count="0" when="eq">
        <tokens>
            <concat>
                <filterchain>
                    <tokenfilter>
                        <stringtokenizer delims="\r" />
                    </tokenfilter>
                </filterchain>
            <propertyresource name="version.revisions" />
            </concat>
        </tokens>
    </resourcecount>
    <echo>Revision : ${version.revision}</echo>

    <exec executable="git" outputproperty="version.hash">
        <arg value="rev-parse"/>
        <arg value="--short"/>
        <arg value="HEAD"/>
    </exec>
    <echo>Hash : ${version.hash}</echo>


    <exec executable="git" outputproperty="version.branch">
        <arg value="rev-parse"/>
        <arg value="--abbrev-ref"/>
        <arg value="HEAD"/>
    </exec>
    <echo>Branch : ${version.branch}</echo>

    <exec executable="git" outputproperty="version.diff">
        <arg value="diff"/>
    </exec>

    <condition property="version.dirty" value="" else="-dirty">
        <equals arg1="${version.diff}" arg2=""/>
    </condition>

    <tstamp>
        <format property="version.date" pattern="yyyy-mm-dd.HH:mm:ss" locale="en,US"/>
    </tstamp>
    <echo>Date : ${version.date}</echo>

    <property name="version" value="${version.revision}.${version.hash}.${version.branch}${version.dirty}.${version.date}" />

    <echo>Version : ${version}</echo>

    <echo file="version.properties" append="false">version = ${version}</echo>

</target>

结果看起来像这样:

generate-version:
    [echo] Generate version
    [echo] Revision : 47
    [echo] Hash : 2af0b99
    [echo] Branch : master
    [echo] Date : 2015-04-20.15:04:03
    [echo] Version : 47.2af0b99.master-dirty.2015-04-20.15:04:03

当生成版本号时未提交文件时,此处为脏标志。因为通常在构建/打包应用程序时,每次代码修改都必须在存储库中。


1

连同提交的SHA-1 ID,服务器时间的日期和时间有关?

像这样:

提交发生在2013年8月19日的11:30:25会显示为6886bbb7be18e63fc4be68ba41917b48f02e09d7_19aug2013_113025


1

在Git手册中,标签是解决此问题的绝妙方法:

在Git中创建带注释的标签很简单。最简单的方法是在运行tag命令时指定-a:

$ git tag -a v1.4 -m 'my version 1.4'

$ git tag
v0.1
v1.3
v1.4

查看2.6 Git基础-标记


太可惜了,您必须跳过箍来更改默认设置:By default, the git push command doesn’t transfer tags to remote servers.
MarkHu '16

1

我们正在使用以下命令从git获取版本和修订:

git describe --always --tags --dirty

它返回

  • 不使用标签时提交哈希作为修订(例如gcc7b71f
  • 标签名称在标签上时的版本(例如v2.1.0,用于发布)
  • 标签名称,自上一个标签以来的修订号以及在标签之后提交哈希(例如 v5.3.0-88-gcc7b71f
  • 与上面相同,如果工作树具有本地修改,则加上“脏”标签(例如v5.3.0-88-gcc7b71f-dirty

另请参阅:https : //www.git-scm.com/docs/git-describe#Documentation/git-describe.txt


0

Visual Studio的发布后事件

echo  >RevisionNumber.cs static class Git { public static int RevisionNumber =
git  >>RevisionNumber.cs rev-list --count HEAD
echo >>RevisionNumber.cs ; }

-1

考虑使用

git-rev-label

提供有关Git存储库修订的信息,格式为master-c73-gabc6bec。可以用环境变量和来自Git的信息填充模板字符串或文件。有助于提供有关程序版本的信息:分支,标记,提交哈希,提交计数,脏状态,日期和时间。最有用的事情之一是提交计数,不考虑合并分支-仅第一父级。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.