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

问题描述 投票:0回答:3

我正在编写一个 Makefile 并希望在一个变量中捕获当前分支名称以传递给 --define。 由于脚本有时但并非总是在 travis 上运行,因此 git 存储库可能处于分离状态。

我可以在命令行中提取分支名称,但遗憾的是无法将其捕获到变量中。似乎 print $$2 在 Makefile 环境中不起作用。

我当前的线路是:

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

我得到

dfd943a57015dbd2129ca7b7033c4e1749f18974 BRANCH_NAME 

而不仅仅是

 BRANCH_NAME
git awk makefile
3个回答
11
投票

接受的答案在可靠地提取分支名称时存在问题(哈希没问题)。如果当前 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
© www.soinside.com 2019 - 2024. All rights reserved.