Высокосвязанные подмодули git - PullRequest
14 голосов
/ 15 сентября 2010

У меня есть проект, который нужно разделить на два репозитория: набор общих моделей и моделирование на основе этих моделей с дополнительным кодом.В конечном итоге может быть несколько симуляций с использованием одного и того же набора моделей, поэтому наличие их в отдельном репозитории является определенным требованием.Очевидным решением является использование общих моделей в качестве подмодуля моделирования.

К сожалению, два хранилища будут очень сильно связанными.Люди будут очень часто добавлять что-то в свои общие модели, а затем сразу же использовать это в симуляции.Я предполагаю, что это вызовет много головной боли в процессе интеграции репозитория симуляции.Чтобы объединить изменения от многих разработчиков в симуляции, интегратору придется выполнять параллельные объединения в подмодуле общих моделей.С другой стороны, это также делает необходимым использование подмодулей - имитация действительно нуждается в , чтобы знать, какую версию общих моделей следует использовать.

Проект разрабатываетсязначительное количество людей.Большинство разработчиков владеют только очень беглым знанием git: они добавляют файлы, фиксируют и извлекают из исходного кода, и, надеюсь, имеют ветку dev и stable.Интегратор, естественно, узнал немного больше, но все, что связано с подмодулями, безусловно, будет для него новым.Дополнительный бонус: я собираюсь взять месяц отпуска, поэтому я не смогу потушить пожары.В результате есть много стимулов сделать рабочий процесс действительно трудным испортить, и минимизировать разницу с предыдущими рабочими процессами людей.

Итак, мои вопросы: я собираюсьсожалеть о том, что мы рекомендуем использовать для этого субмодули?(Есть ли лучшая идея?) Какие ошибки я могу ожидать от людей, чтобы я мог предупредить их заранее?Есть ли какие-то хорошие стратегии рабочих процессов, о которых стоит помнить?

Редактировать: Я только что натолкнулся на git slave , которые также стоит посмотреть в этом контексте.Пока не могу дать хорошую оценку способностей / ограничений, помимо того, что есть на его сайте.

Ответы [ 2 ]

14 голосов
/ 16 сентября 2010

Несколько замечаний для всех, кто сталкивается с этим!

Самая большая ошибка, которую собираются сделать новобранцы, это совершить отключение HEAD в подмодуле после выполнения обновления подмодуля.Я собираюсь попытаться противостоять этому с помощью сильных предупреждений от хуков.

Следующим по величине, вероятно, будет сбой при обновлении субмодуля после проверки, которая требует его.Снова, ловушки могут проверить это и предупредить.

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

Я постараюсь опубликовать пример кода из хуков, которые я в конечном итоге использую, и через месяц дополню (надеюсь, не слишком много) настоящими ужасными историями.

Редактировать:

Вот первые наброски крючков.Имейте в виду, что это срочно, и мне легко!

В родительском репо:

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

#!/bin/bash
if git submodule status | grep '^+' > /dev/null; then
    echo "WARNING: common model submodule now out of sync. You probably want to run" 1>&2
    echo "         git submodule update, then make sure to check out an appropriate branch" 1>&2
    echo "         in the submodule." 1>&2
fi

Для пост-фиксации, если есть изменения субмодуля, мы предупреждаем пользователя, что он, возможно, забыл включить их в свой коммит.В этом сильно связанном случае это очень хорошее предположение.Маловероятно, что пользователь изменил симуляцию и обычные модели отдельно .

#!/bin/bash
if git submodule status | grep '^+' > /dev/null; then
    echo "WARNING: common model submodule has changes. If the commit you just made depends" 1>&2
    echo "         on those changes, you must run git add on the submodule, and then run" 1>&2
    echo "         git commit --amend to fix your commit." 1>&2
fi

А в подмодуле - пост-кассовый хук, чтобы строго предупредить о отключенной HEAD:

#!/bin/bash

get_ppid() {
    ps --no-headers -o ppid $1
}

# Check to see if this checkout is part of a submodule update
# git submodule calls git checkout, which calls this script, so we need to
# check the grandparent process.
if ps --no-headers -o command $(get_ppid $(get_ppid $$)) | grep 'submodule update' &> /dev/null; then
    if ! git symbolic-ref HEAD &> /dev/null; then
        echo "WARNING: common model submodule entering detached HEAD state. If you don't know" 1>&2
        echo "         what this means, and you just ran 'git submodule update', you probably" 1>&2
        echo "         want to check out an appropriate branch in the submodule repository." 1>&2
        echo
        # escape the asterisk from SO's syntax highlighting (it sees C comments)
        branches=($(git for-each-ref --format='%(objectname) %(refname:short)' refs/heads/\* | grep ^$(git rev-parse HEAD) | cut -d\  -f2))
        case ${#branches} in
            0 )
                ;;
            1 ) 
                echo "Branch '${branches[0]}' is at HEAD"
                ;;
            * )
                echo "The following branches are at HEAD: ${branches[@]}"
                ;;
        esac
    fi
    echo
fi

Я также добавляю ловушку перед фиксацией, чтобы просто прервать коммиты, сделанные с отсоединенным HEAD (если это не перебазировка).Я в ужасе от того, что классическая «все мои коммиты исчезли» запаниковала.Вы всегда можете обойти это с помощью --no-verify, если знаете, что делаете.

7 голосов
/ 15 сентября 2010

Подмодуль является хорошим выбором для того, чтобы ссылаться на точную ревизию различных компонентов.
Как я подробно описал в « истинной природе подмодулей », вы все равно можете обновить любой из подмодулей, при условии, что вы сначала фиксируете их (а затем переходите к родительскому репо и также фиксируете)

Однако для тесно связанных модулей я бы старался избегать:

«Я полагаю, это вызовет много головной боли в процессе интеграции репозитория моделирования».

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

Это (тянуть, перебазировать, толкать) не всегда возможно из-за:

  • «продвинутые» (менее базовые) операции Git (и рабочий процесс, не совсем идентичный текущему)
  • задействованная работа (с учетом эволюции других участников)
  • настройка среды (может быть предпочтительнее настроить дополнительную среду, чтобы сделать эту перебазировку, что опять-таки «не так просто»)

Но это было бы тем же направлением, которое я бы попробовал.

(... но может и не как раз перед месячным отпуском;)
Опять же, кто берет 1032 * всего месяца отпуска ?! Никогда не слышал об этой концепции раньше)

...