跟踪Makefile中的分支更改

时间:2014-06-20 05:05:05

标签: git makefile hook

出于Makefile的目的,我如何发现当前分支的HEAD已经改变了?

我正在寻找类似的东西,但是对于通用的当前分支:

all: report.txt

report.txt: .git/refs/heads/master
    touch report.txt

3 个答案:

答案 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 $@

然后,如果分支或提交发生更改,将构建目标。