Сегодняшняя стратегия по синхронизации проверок подмодулей git с идентификаторами коммитов?

На StackOverflow было задано много вопросов об автоматически обновляемых подмодулях, в том числе:

Но мне кажется, что для подмодулей git пока нет единого подхода, который работает как svn up в отношении svn-externals.

Так как git меняется каждый день, я осмелюсь спросить еще раз:

Существует ли (удобный) способ инициализации и автоматического обновления проверок подмодулей (т. е. синхронизация с соответствующими идентификаторами фиксации подмодулей) для checkout и< /em> pull (т.е. merge и rebase)?

В настоящее время у меня есть два подхода для этого:

№1: создайте хук post-checkout, post-merge и post-rewrite со следующим содержанием

#!/bin/sh
git submodule update --init --recursive

как вы уже можете видеть, этот подход имеет несколько недостатков:

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

№2: настройте псевдонимы для pull и checkout

git config --global alias.up 'pull --recurse-submodules'
git config --global alias.co 'checkout --recurse-submodules'

Но и это нехорошо:

  • это не будет --init подмодулей (можно решить, запустив pull/checkout и submodule update отдельно вместо этого
  • он нестандартен и не работает со сценариями и фрагментами кода.
  • легко забыть использовать up/co вместо pull/checkout
  • он работает только на локальной машине/пользователе

Этот подход был бы немного больше похож на то, что я хочу, если бы вы могли сделать что-то вроде

git config --global pull.recurseSubmodules true
git config --global pull.initSubmodules true
git config --global checkout.recurseSubmodules true
git config --global checkout.initSubmodules true

.. но вы не можете, не так ли?


person frans    schedule 09.10.2017    source источник


Ответы (1)


Начиная с Git 2.13, вы можете выполните git checkout --recurse-submodules <ref>, чтобы убедиться, что рабочее дерево(я) активного(ых) подмодуля(ей) синхронизировано с фиксацией(ями) подмодуля, записанной в суперпроекте в <ref>.

Начиная с Git 2.14, вы можете выполните git pull --recurse-submodules, который выполнит обычное извлечение, а затем вызовет git submodule update --init --recursive--rebase, если вы извлекли с помощью --rebase), поддерживая активное рабочее дерево (я) подмодулей в синхронизации с фиксацией (фиксациями) подмодулей, записанными в суперпроекте.

Начиная с Git 2.15, настройка git config submodule.recurse true сделает это поведение по умолчанию для всех команд которые принимают флаг --recurse-submodules, кроме clone и ls-files.

Невозможно сделать это поведение поведением по умолчанию без изменения конфигурации или использования этих параметров.


Обратите внимание, что выполнение git checkout --recurse-submodules <branch>, когда текущая ветка не имеет подмодулей, а <branch> инициализирует вложенные подмодули, завершается ошибкой до Git 2.27.

person philb    schedule 12.05.2020