Git submodule mess: как использовать подмодули git с разработчиками, не знакомыми с git? - PullRequest
6 голосов
/ 28 октября 2011

Я очень разочарован использованием функции субмодуля в git.Либо я все еще не понимаю, либо это просто не работает, как я этого ожидаю.Приведена следующая ситуация проекта:

Project
  | .git
  | projsrc
  | source (submodule)
  | proj.sln

В этом сценарии source указывает на другой репозиторий, содержащий общие исходные данные для всех наших проектов.Существует много разработок, происходящих под source , а также под projsrc .К сожалению, Project указывает на некоторую фиксацию исходного подмодуля, а не на фактическую HEAD его.Насколько я знаю, это обычное поведение мерзавцев.

Я уже обнаружил, что

git submodule update

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

Можно ли присоединить Project к HEAD подмодуля, независимо от того, сломает ли это компиляцию Project или нет.Я просто не хочу всегда заходить в каталог подмодулей и делать там git pull .Поскольку я думаю, что я могу потерять свои изменения, сделанные в каталоге подмодулей, потому что это просто присоединяется к коммиту, а не к какой-либо ветке или около того.

Пожалуйста, рассмотрите следующие ограничения :

  • Разработчики в нашей группе не так хорошо знакомы со всеми VCS.Мы привыкли использовать действительно огромный svn-репозиторий прежде, без каких-либо внешних функций репо.
  • Мы работаем на Windows
  • Лучше всего будет решение "click'n'forget", так как большинствоучастники проекта довольно напуганы использованием интерфейса командной строки:)

Ответы [ 3 ]

8 голосов
/ 28 октября 2011

Причина, по которой подмодуль указывает на конкретную ревизию, важна. Если вы укажете на ГОЛОВУ, сборки будут невоспроизводимыми . То есть Если вы извлечете вчерашнюю версию Проекта, вы никогда не узнаете, какая точная версия источника @ HEAD была вчера.

Вот почему он всегда хранит определенную версию ша.

Чтобы вытащить все подмодули вы можете использовать Простой способ вытащить последние из всех подмодулей

2 голосов
/ 29 октября 2011

Примите во внимание следующее:

  1. источник указывает на HEAD (как вам хотелось бы).
  2. вы вносите изменения в источник внутри вашего проекта (вы фиксируете, но не нажимаете их)
  3. теперь у вас есть два HEAD: один в источнике вашего проекта, другой в вашем общем источнике.

Какой из них вы бы хотели видеть в своем Проекте при обновлении подмодуля?

Проблема (и главная особенность) git в вашем случае заключается в том, что вы рассматриваете commitи толчок как атомная операция.Это не так.Git децентрализован.Там нет общей головы.У вас может быть несколько репозиториев с разными заголовками.

Учтите это:

  1. у вас есть 3 разработчика (A, B и C) с проектом git.
  2. онивсе тянут ЗАГОЛОВОК проекта.
  3. каждый разработчик внес изменения в проект
  4. , теперь у каждого из них есть 3 ГОЛОВКИ: ГОЛОВКА, В ГОЛОВА и С ГОЛОВА.

Какой заголовок вы считаете «истинным» заголовком?

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

Вы должны рассматривать подмодуль git как стороннюю библиотеку, которая должна обновляться вручную с помощью следующих двух шагов:

  1. Вытащите свой подмодуль ("скачать стороннюю библиотеку ")
  2. Зафиксируйте свой проект с обновленным подмодулем (" поместите новую версию третьей стороны библиотеки в свой проект ")

Если вы хотите внести изменения в подмодуль, вам следуетсделайте то же самое в обратном порядке:

  1. Зафиксируйте свой подмодуль ("внесите изменения в библиотеку третьей стороны")
  2. Нажмите свой субмодуль ("отправьте свои изменения сопровождающему библиотеки третьей стороны"))
  3. Зафиксируйте ваш проект с обновленным подмодулем («поместите новую версию библиотеки третьих сторон в ваш проект»)
2 голосов
/ 29 октября 2011

Я не очень хорош в Git и субмодуле. Но я думаю, что некоторые простые правила были бы очень полезны.

  1. Подтвердить и нажать из подкаталога.
  2. Вернитесь в корень вашего проекта, проверьте статус, если вам нужно выполнить коммит, и нажмите снова.

когда вытащить. можно попробовать использовать скрипт, чтобы связать «pull / submodule update» вместе. И делать это только в корне вашего проекта.

...