Как достоверно определить дату последнего коммита в удаленном репозитории? - PullRequest
1 голос
/ 18 февраля 2020

Я видел этот ответ, и он почти именно то, что мне нужно.

Разница в том, что напечатает дату для человеческих глаз, а мне нужно проверить это в Makefile.

В частности, мне нужно перестроить определенный файл, если что-то изменилось в репо после его создания.

У меня может не быть локальной копии репо, поэтому мне может понадобиться полный "git клон" (возможно мелкий), но я не могу напрямую использовать даты файлов, потому что git не сохраняет их.

Мне нужно что-то вроде: if myfile is_older $(git log -1 --format=%cd origin/master); then ... или, в Makefile:

myfile: $(somefunc $(shell git log -1 --format=%cd origin/master))
        commands to rebuild myfile

но я не знаю, как это написать.

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Как отмечает @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 будет срабатывать, даже если файл уже существует и не имеет (более поздних) зависимостей.

0 голосов
/ 18 февраля 2020

Если вам нужно изменить формат даты, попробуйте добавить параметр - дата .

Например:

  • рф c

    git log -1 --format=%cd --date=rfc
    Wed, 5 Feb 2020 16:34:38 +0200
    
  • относительно

    git log -1 --format=%cd --date=relative
    13 days ago
    
  • изо-строгий

    git log -1 --format=%cd --date=iso-strict
    2020-02-05T16:34:38+02:00
    
  • короткий

    log -1 --format=%cd --date=short
    2020-02-05
    
  • raw

    git log -1 --format=%cd --date=raw
    1580913278 +0200
    

Для получения дополнительной документации просмотрите: https://git-scm.com/docs/git-log

Возможно, я бы использовал «raw». Это форматирование даты удобно для вашего сценария?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...