Автоматическая инициализация и обновление подмодулей в Makefile - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть проект git с несколькими подмодулями (выбор, о котором я немного сожалею в ретроспективе).В нем используется gnu make

. В настоящее время я ожидаю, что люди вручную выдадут git submodule update --init 1 до первого создания проекта, а также после получения любых изменений, которые обновили ссылку на подмодуль.

Однако я бы хотел, чтобы Makefile автоматически запускал эти команды, когда они необходимы.Это нормально, если они выдают команды иногда, когда они не нужны (ложное обновление), но это не должно происходить регулярно.

Для начального init кажется достаточно иметь правило, подобное (дляподмодуль, который находится в каталоге module1:

module1/.git:
    git submodule update --init

И здесь выбор .git в качестве файла для «представления» подмодуля является довольно произвольным, вместо него может быть какой-то другой файл.

Однако это не очень хорошо работает для обновления подмодуля, когда ссылка обновлена. Я думаю, я мог бы сделать подмодуль зависимым от корневого файла .gitmodules, который, я думаю, должен измениться при обновлении ссылки на подмодуль, что-тонапример:

module1/.git: .gitmodules
    git submodule update --init

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

Ищите здесь более чистое решение.


1 Или возможноДля начального clone используйте аргумент --recursive, который имеет тот же эффект.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете создать файл перед обновлением подмодулей:

all: .gitmodules_updated my-target

.gitmodules_updated : .gitmodules 
     touch .gitmodules_updated
     git submodule update --init

Если обновляется .gitmodules, он становится новее, чем .gitmodules_updated и, следовательно, подмодули обновляются.

0 голосов
/ 19 сентября 2018

Я создал что-то вроде этого:

.PHONY: check-and-reinit-submodules
check-and-reinit-submodules:
    @if git submodule status | egrep -q '^[-]|^[+]' ; then \
            echo "INFO: Need to reinitialize git submodules"; \
            git submodule update --init; \
    fi

Он использует git submodule status, чтобы выяснить, не был ли субмодуль инициализирован (- в начале) или каким-то образом модифицирован / устаревшим (+ в начале).Эта временная цель будет выполняться всегда, но git submodule update --init будет выполняться только при необходимости.

...