43

我目前正在使用三个命令的集合来获取最新提交的当前标记、分支以及日期和 SHA1。

git describe --always --tag
git log -1 --format="%H%n%aD"
git rev-parse --abbrev-ref HEAD

这将输出如下内容:

1.2.3-5-gdeadbeef
deadbeef3b8d90071c24f51ac8f26ce97a72727b
Wed, 19 May 2010 09:12:34 +0200
master

老实说,我对此完全没问题。但是我正在使用来自 Maven 的这些命令,任何以前使用过 Maven 的人都知道诸如外部命令之类的东西会使 POM 膨胀多少。我只是想精简我的 pom.xml 并且可能会减少一点执行时间。

4

6 回答 6

52
  1. git log非常灵活,有很多很多的选择。您可能无法重现上述三个命令的确切输出,但您可能已经足够接近以达到您需要的效果。

    例如:

    git log --pretty=format:'%ad %h %d' --abbrev-commit --date=short -1
    

    生成最新(HEAD)提交的日期、SHA-1 和符号引用(包括标签):

    2010-05-20 45bd5e7(头,起源/主人)

    之后,大概sed和/或awk可能 Maven-native 方法可以进行微调/抛光。请注意,特定标签与特定提交相关联,因此如果 HEAD 之前的三个提交被标记为例如“v1.0.0”,您将不会看到“v1.0.0”与多于。

  2. 提供提交的简洁描述的更简单的单个命令是:

    git describe
    

    它写出最新的适用标签、自标记提交以来的提交次数和 SHA1:

    v3.3.0-46-g71a77dc

  3. 我对 Maven 一点也不熟悉,也不知道运行外部进程有多么容易/困难,所以不确定以下是否有任何帮助,但我想我可能会提到它以防万一。

    对于您描述的确切目的,即标记构建,在 autoconf/automake 框架中,我实际上使用了类似的东西:

    BUILDTAG="`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`"
    

    这会产生适合附加到程序路径末尾的东西:

    大师-c5282ff

    更扩展的描述,适合作为注释或打印标识符包含:

    BUILDDESC="$(git symbolic-ref HEAD 2> /dev/null | cut -b 12-)-$(git log --pretty=format:'%h, %ad' -1)"
    

    产生类似的东西:

    master-c5282ff,2010 年 3 月 12 日星期五 22:19:51 -0600

我认为玩弄git log,可能与文本处理工具/方法结合使用会让你得到你想要的。

于 2010-05-20T00:42:09.890 回答
10

我不使用 Maven,所以我不知道你是如何调用这些命令的,但是向 git 添加自定义命令是相当简单的。

创建一个名为 git-tbc 的脚本,如下所示:

#!/bin/bash

git describe --always --tag
git log -1 --format="%H%n%aD"
git rev-parse --abbrev-ref HEAD

确保 git-tbc 在您的 PATH 中,您现在可以调用“git tbc”。这是你要找的吗?

于 2010-05-19T08:11:30.217 回答
6

我正是为此目的创建了一个 Maven 插件,它确实符合我的需求(事实上它现在已经超出了它们)。

它被称为Mavanagaiata,它是开源的,可从 Maven Central 获得。

于 2011-05-13T07:28:23.433 回答
4

我对这类事情的“回购”总是bash_completion。好的,“tab tab”是 bash 成为高效工具的方式,那么,所有这些神奇的东西从何而来?

有一个/etc/bash_completion.d/目录,其中保留了 bash 完成的扩展名。必须有一个 git 文件可执行文件,打开它并寻找类似 get_refs() 的东西。如果您检查一下,您会发现git describegit for-each-ref是您的朋友,让我们尝试一些示例:

一个常见的回购:

$ cd /your/git/repo; git branch -a
  master
  blaster
* brunch
  lunch
  remotes/origin/master
  remotes/origin/develop
  remotes/github/master

哪个是我检查的分支?

$ git describe --contains --all HEAD
brunch

我的遥控器是什么?

$ git remote
origin
github

遥控器上的分支是什么?

$ git for-each-ref --format="%(refname:short)" refs/remotes
origin/master
origin/develop
github/master

我的当地分支机构是什么?

$ git branch
  master
  blaster
* brunch
  lunch

...更可解析的分支输出?

$ git for-each-ref --format="%(refname:short)" refs/heads
master
blaster
brunch
lunch

标签呢?

$ git for-each-ref --format="%(refname:short)" refs/heads refs/remotes refs/tags
master
blaster
brunch
lunch
origin/master
origin/develop
github/master
release-0_1
release-0_2
release-1_0

检查此命令的“手册页”,里面还有更多!

于 2011-09-16T08:02:07.493 回答
3

我找到了这个 Maven 插件:https ://github.com/alx3apps/jgit-buildnumber ,这似乎是git projectsbuildnumber-maven-plugin的一个很好的替代品。此外,它可从 Maven 中央存储库获得。

它在Maven 3中运行良好。对于 Maven 2 多模块项目,只需在父 pom 的属性部分添加以下行:

<session.executionRootDirectory>${basedir}</session.executionRootDirectory>
于 2012-11-20T09:31:46.857 回答
1

这将显示 HEAD 的提交 ID,以及恰好位于 HEAD 的任何分支或任何标签。

git reflog --decorate -1

样本输出:

484c27b (HEAD, tag: deployment-2014-07-30-2359, master, origin/master) HEAD@{0}: 484c27b878ca5ab45185267f4a6b56f8f8d39892: updating HEAD
于 2014-08-25T13:30:04.497 回答