我正在编写一个 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
接受的答案在可靠地提取分支名称时存在问题(哈希没问题)。如果当前 HEAD 提交是多个分支的当前头部,那么 BRANCH 的值将是“branch1 branch2”,这将在您的 Makefile 中产生意想不到的结果。
只需使用:
BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
HASH := $(shell git rev-parse HEAD)
最适合我的是:
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)
可能不是在 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