Git hook для обновления подмодуля Git при смене ветки - PullRequest
0 голосов
/ 04 мая 2018

Я работаю со старым кодом, который использует подмодули Git. В коде есть несколько расходящихся ветвей, которые активно используются, и каждая из этих ветвей зависит, к сожалению, от разных версий соответствующих подмодулей; это сделало разработку чрезвычайно сложной . Одна из проблем, с которой я сталкиваюсь, заключается в том, что, когда я переключаюсь между ветвями, например, с. От master до newfeature-foo при использовании git checkout newfeature-foo состояние подмодулей остается на уровне master, что часто приводит к ошибкам компиляции, и, что еще хуже, может вызывать различия в поведении во время выполнения, что наносит ущерб пользовательскому тестированию и общему здравомыслию.

Например, для конфигурации .gitmodules:

[submodule "robotcontroller"]
    path = robotcontroller
    url = https://coolrobots.com/repos/robotcontroller
    branch = master
    ignore = dirty
  • ветвь master при коммите 77d4697 имеет ссылку на robotcontroller @ f57d1b3
  • ветвь newfeature-foo в b38d29f имеет ссылку на robotcontroller @ 60b27d4
  • ветвь master в 873639f вообще не имеет подмодуля robotcontroller
  • ветвь newfeature-foo в 301dca4 имеет ссылку на robotcontroller @ bdf5991

Нет ли способа, например использование перехватчиков Git для принудительной автоматической полной повторной проверки всех подмодулей, перечисленных в файле .gitmodules, когда он изменяется при извлечении из «корневого» репозитория Git?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

post-checkout ловушка, которая удаляет robotcontroller и обновляет все подмодули.

#!/bin/sh

# post-checkout hook that update submodules

prev_HEAD="$1"
new_HEAD="$2"
new_branch="$3"

if [ "$new_branch" = 1 ]; then
   if ! grep -Fq robotcontroller .gitmodules; then
      rm -rf robotcontroller
   fi

   git submodule update
fi

exit 0

PS. Правильный термин для корневого репозитория Git - «суперпроект». : -)

0 голосов
/ 04 мая 2018

Похоже, что в вашем репо происходит много вещей, которые запутывают. Мы могли бы пройтись вперед и назад, чтобы найти конфликтующие настройки, но вот что я бы сделал:

Избавиться от ignore = dirty

Это просто скрывает полезную информацию - возможно, подмодуль не проверяется чисто, потому что он переопределит файлы. По крайней мере, убедитесь, что подмодуль чист, прежде чем пытаться с ним работать - cd mysubmodule и git status = clean

...