對於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