在makefile变量中捕获git分支名称

4

我正在编写一个Makefile,希望能够将当前分支名称捕获到一个变量中,并传递给--define。由于该脚本有时会在travis上运行,但git存储库可能处于分离状态,因此需要注意这一点。

我可以在命令行上提取分支名称,但不幸的是无法将其捕获到一个变量中。似乎在Makefile环境中,print $$2无法正常工作。

我的当前代码行是:

BRANCH := $(shell git for-each-ref --format='%(objectname) %(refname:short)' refs/heads | awk "/^$$(git rev-parse HEAD)/ {print $$2}")

我理解了

dfd943a57015dbd2129ca7b7033c4e1749f18974 BRANCH_NAME 

不仅仅是

 BRANCH_NAME

尝试运行以下命令:awk "/$(git rev-parse HEAD)/{print \$2}" - karakfa
我必须这样写,但是你用反斜杠的提示很有用!awk "/$$(git rev-parse HEAD)/{print $$2}" - Fabian
只是出于好奇,如果git rev-parse HEAD生成的哈希值与任何分支名称都不匹配,那么你希望得到什么结果? - torek
@torek 如果是这样,那么空字符串就可以了。如果可能的话,我只想显示当前源的可读描述。否则就只有哈希值了。 - Fabian
这似乎需要做很多工作才能获取当前分支名称。为什么不使用类似 BRANCH:= $(shell git symbolic-ref -q --short HEAD) 的方法呢? - MadScientist
@MadScientist,原因是我想为一个游离的 HEAD 获取一个描述,因为 Travis 是以那种方式检出源代码的。 - Fabian
3个回答

12

被接受的答案在可靠地提取分支名称方面存在问题(哈希值是正确的)。如果当前 HEAD 提交是多个分支的当前头,则 BRANCH 的值将为 "branch1 branch2",这将在 Makefile 中产生意外结果。

只需使用:

BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
HASH := $(shell git rev-parse HEAD)

4

对我最有效的方法是:

BRANCH := $(shell git for-each-ref --format='%(objectname) %(refname:short)' refs/heads | awk "/^$$(git rev-parse HEAD)/ {print \$$2}")
HASH := $(shell git rev-parse HEAD)

这些变量随后可以与$(BRANCH)等一起使用。


0

这可能不是在bash中滥用shell使用的正确方式,但是

    .PHONY: git-snapshot  ## @-> for your current commit into a new timestamped branch
    git-snapshot:
      @clear
      @$(eval current_branch=`git rev-parse --abbrev-ref HEAD`)
      @$(eval current_hash=`git rev-parse --short HEAD`)
      @$(eval current_time=`date "+%Y%m%d_%H%M%S"`)
      @git branch "${current_branch}--${current_time}-${current_hash}"
      git branch -a | grep ${current_branch} | sort -nr

用法

    make git-snapshot
    3063--data-cleaning--20230311_072846-9f32fa5
    3063--data-cleaning--20230311_072721-9f32fa5
    3063--data-cleaning--20230311_071720-9f32fa5
    3063--data-cleaning--20230311_071719-9f32fa5
    3063--data-cleaning--20230311_071718-9f32fa5
    3063--data-cleaning--20230311_071716-9f32fa5
  * 3063--data-cleaning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接