Как отмечает @Slavomir, ключевым ингредиентом будет опция --date
, но не со значением raw
, а скорее со значением unix
(чтобы получить только число секунд с эпохи в UT C, без часового пояса ).
$ git log -1 --format=%cd --date=unix
1582030040
(ср. do c).
Затем вы сможете использовать команду оболочки date +%s -r myfile
, чтобы получить отметку времени myfile
.
(ср. man page ).
Наконец, вы можете разработать функцию Makefile, чтобы упростить сравнение, что приведет к минимальному рабочему примеру, подобному следующему:
Makefile
# Return 'true' if $(1) does not exist or is older than branch $(2)
check_repo_change = $(shell if [ ! -e $(1) ] || [ $$(date +%s -r $(1)) -lt \
$$(git log -1 --format=%cd --date=unix $(2)) ]; then echo true; fi)
# Note that you'll probably need to run "git fetch" at some point
BRANCH := origin/master
all: myfile
.PHONY: all
ifeq '$(call check_repo_change,myfile,$(BRANCH))' 'true'
myfile:
set -x; echo ok >> $@
else
myfile:
$(info No change detected in branch $(BRANCH))
endif
.PHONY: myfile
Примечание: опция .PHONY
обязательна, так что цель myfile
будет срабатывать, даже если файл уже существует и не имеет (более поздних) зависимостей.