出于Makefile的目的,我如何发现当前分支的HEAD已经改变了?
我正在寻找类似的东西,但是对于通用的当前分支:
all: report.txt
report.txt: .git/refs/heads/master
touch report.txt
答案 0 :(得分:2)
.git/HEAD
给出当前分支的ref,因此你可以解除.git/HEAD
,以获得实际的当前分支ref。
all: report.txt
current := $(shell cut -c6- .git/HEAD)
report.txt: .git/${current}
touch report.txt
请注意,如果切换分支,即使新分支与前一个分支位于同一个提交中,您也会检测到更改。
答案 1 :(得分:1)
SHELL:=/bin/bash
all: report.txt
report.txt: up-to-date
@echo 'Updating $@'
@touch report.txt
up-to-date: force
@cmp -s '$@' <(git rev-parse @{0}) || git rev-parse @{0} > '$@'
force: ;
up-to-date
目标将最新文件的内容与HEAD ref的当前版本进行比较(@{0}
是当前参考的第0个前一个reflog条目。)< / p>
当该比较表明存在差异时,它会将新修订版本放入文件中,从而更新它并触发make以重建依赖于它的report.txt
。当比较表明文件相同时,文件不会更新,并且make看不到重建report.txt
的理由。
力量目标力量总是考虑到需要建造的最新状态。您可能已经考虑使用.PHONY: up-to-date
而不是强制,但伪用目标的语义在用作先决条件时会使其无法正常工作(始终会运行report.txt的规则)。
答案 2 :(得分:1)
@ndec建议的一个增强功能,它不关心&#34;分离的HEAD&#34;。
在目标
之前插入此内容subdir := ./ # can be ./src in different location
subdep := $(subdir)/.git/HEAD # may have SHA-1 (detached HEAD)
gitref := $(word 2, $(shell cat $(subdep))) # may be a ref HEAD (for any branch/tag)
ifneq "$(gitref)" "" # append it if referenced HEAD
subdep += $(subdir)/.git/$(gitref) # e.g. HEAD & refs/heads/master
endif
然后您可以将$(subdep)添加到目标依赖项,例如
report.txt: $(subdep)
@touch $@
然后,如果分支或提交发生更改,将构建目标。