git submodule для отслеживания последних

136

Мы перемещаем наш (огромный) проект в git и думаем об использовании подмодулей. Наш план состоит в том, чтобы в суперпроекте было три разных главы: релиз, стабильный, последний. Лидеры проекта будут управлять выпуском и стабильными ветвями. Они будут перемещать субмодули по мере необходимости.

Вопрос в "последней" голове. Мы бы хотели, чтобы «последняя» голова суперпроекта отслеживала основные ветви всех подмодулей (автоматически). А также было бы здорово, если бы он показывал историю всех коммитов в подмодуле.

Я посмотрел на gitslave, но это не совсем то, что мы хотим. Какие-либо предложения?

l.thee.a
источник
Пока вы просили инструмент, я просто хочу связать этот вопрос, который собирает однострочники, делающие то же самое: stackoverflow.com/questions/1030169/…
Тобу
Git теперь предлагает отслеживание последних с помощью подмодулей: см. Мой отредактированный ответ.
VonC

Ответы:

235

Обновление март 2013

В Git 1.8.2 добавлена ​​возможность отслеживать ветки.

« git submodule» начал изучать новый режим для интеграции с кончиком удаленной ветви (в отличие от интеграции с фиксацией, записанной в gitlink суперпроекта).

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 

Если у вас подмодуль уже представить вам сейчас желание будет отслеживать ветку, увидеть « как сделать существующий подмодуль отслеживать ветвь ».

Также см. Учебник Вогеллы по подмодулям для получения общей информации о подмодулях.

Примечание:

git submodule add -b . [URL to Git repo];
                    ^^^

Смотрите git submoduleсправочную страницу :

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


Смотрите коммит b928922727d6691a3bdc28160f93f25712c565f6 :

submodule add: Если --branchдано, запишите это в.gitmodules

Это позволяет вам легко записывать submodule.<name>.branchопцию .gitmodulesпри добавлении нового субмодуля. С этим патчем

$ git submodule add -b <branch> <repository> [<path>]
$ git config -f .gitmodules submodule.<path>.branch <branch>

сводится к

$ git submodule add -b <branch> <repository> [<path>]

Это означает, что будущие звонки

$ git submodule update --remote ...

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

Подписано: У. Тревор Кинг


Оригинальный ответ (февраль 2012 г.):

Подмодуль - это отдельный коммит, на который ссылается родительское репо.
Поскольку это Git-репо само по себе, «история всех коммитов» доступна через git logэтот подмодуль.

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

  • CD в ​​подмодуле
  • git fetch / pull, чтобы убедиться, что он имеет последние коммиты в правой ветке
  • CD в ​​родительском репо
  • добавить и зафиксировать, чтобы записать новый коммит субмодуля.

gitslave (на который вы уже смотрели) кажется наиболее подходящим, в том числе для операции фиксации .

Немного раздражает вносить изменения в подмодуль из-за необходимости проверить правильную ветвь подмодуля, внести изменения, зафиксировать, а затем перейти в суперпроект и зафиксировать коммит (или, по крайней мере, записать новое местоположение модуля). подмодуль).

Другие альтернативы подробно описаны здесь .

VonC
источник
1
@BraveNewMath вам необходимо оформить правильный филиал в вашем подмодуль, затем перейдите в родительский репозиторий и введите: git config -f .gitmodules submodule.<path>.branch <branch>. Добавьте все, совершите и нажмите.
VonC
2
@BraveNewMath Я подробно описываю все этапы создания подмодуля для отслеживания ветки в stackoverflow.com/a/18799234/6309 .
VonC
1
Важно использовать --remoteтег, если вы не хотите, чтобы при обновлении отсоединялись заголовки, задаваясь вопросом, почему кажется, что ваш только что вытащенный код отстает от мастера!
Крис Уоттс
3
@DC_ Я согласен с "этим ответом" (так как я написал это). Функция «после ветки» предназначена для обновления подмодуля до последней фиксации ветки. Как только это будет сделано, вам все равно придется добавить и зафиксировать новое состояние субмодуля в родительском репо. И следующий клон проверит это состояние (без головы).
VonC
3
@VonC Итак, чтобы уточнить, функция «после перехода» влияет только на поведение git submodule updateкоманды, сообщая ей, какой коммит (то есть, самый последний коммит на мастере) обновлять субмодуль, а не заставлять родительский репозиторий обновлять Коммит указывает субмодуль во время клонирования?
Christner