对于Makefile的目的,我怎么知道当前分支的HEAD已经改变了?Makefile的跟踪分支变化
我正在寻找这样的事情,但对于一个普通的当前分支:
all: report.txt
report.txt: .git/refs/heads/master
touch report.txt
对于Makefile的目的,我怎么知道当前分支的HEAD已经改变了?Makefile的跟踪分支变化
我正在寻找这样的事情,但对于一个普通的当前分支:
all: report.txt
report.txt: .git/refs/heads/master
touch report.txt
.git/HEAD
给出了当前分支的裁判,这样你就可以反引用.git/HEAD
,以获得实际当前分支参考。
all: report.txt
current := $(shell cut -c6- .git/HEAD)
report.txt: .git/${current}
touch report.txt
请注意,如果您切换分支,你会发现一个变化即使新的分支是在同犯与以前的分支。
SHELL:=/bin/bash
all: report.txt
report.txt: up-to-date
@echo 'Updating [email protected]'
@touch report.txt
up-to-date: force
@cmp -s '[email protected]' <(git rev-parse @{0}) || git rev-parse @{0} > '[email protected]'
force: ;
的up-to-date
目标靠在头部ref的当前修订向上最新文件的内容(@{0}
是当前REF第0个先前引用日志条目)进行比较。
当比较结果显示不同时,它会将新修订版放入文件中,从而更新它并触发make以重建依赖于它的report.txt
。当比较结果表明文件相同时,文件不会被更新,并且认为没有理由重建report.txt
。
力量目标力量总是认为需要被修造的最新。您可能曾想过使用.PHONY: up-to-date
而不是强制,但在用作prereq时,假目标的语义会使其无法按预期运行(report.txt的规则将始终运行)。
对@ndec的一个增强建议,它不关心“分离的HEAD”。
目标之前插入此
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 [email protected]
然后,如果分支或提交更改,则将构建目标。
看起来不错,但解释会有帮助。 – Beryllium
@Beryllium我在提交答案之前告诉自己要解释这些概念,但后来我忘记了/懒惰了。感谢刺激。 –
这似乎不工作。 '最新'永远不会被'make report.txt'重新运行。你必须自己手动指定它,这其实并不比完全移除力更好。 – UpAndAdam