обновление подмодуля ЖКТ



Я не совсем понимаю, что означает следующее (от обновление подмодуля git docs):




...заставит голову подмодулей отсоединиться, если --rebase или это...




как --rebase/--merge изменить?



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




  • из этих подмодулей я могу создавать ветви/модификации и использовать push / pull так же, как и в обычных репозиториях, или есть вещи, о которых нужно быть осторожным?

  • как бы я продвинул подмодуль, на который ссылается commit от say (tagged) 1.0 до 1.1 (даже если глава исходного РЕПО уже находится в 2.0), или выберите, какая ветвь commit используется вообще?

673   4  

4 ответов:

этой страница GitPro не подведем следствие с Git подмодуля обновление красиво

при выполнении git submodule update, Он проверяет конкретную версию проекта, но не в ветке. Это называется иметь отделенную головку - это означает, что головной файл указывает непосредственно на фиксацию, а не на символическую ссылку.
проблема в том, что вы обычно не хотите работать в отделенной головной среде, потому что ее легко потерять изменения.
Если вы выполняете начальное обновление подмодуля, фиксируете в этом каталоге подмодуля без создания ветви для работы, а затем снова запускаете обновление подмодуля git из суперпроекта без фиксации в то же время, Git перезапишет ваши изменения, не сообщая вам. Технически вы не потеряете работу, но у вас не будет ветки, указывающей на нее, поэтому ее будет несколько сложно восстановить.


Примечание Март 2013:

как упоминается в "git подмодуль отслеживания последних", теперь подмодуль (git1.8.2) может отслеживать ветвь.

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

# update your submodule
git submodule update --remote 
# or (with rebase)
git submodule update --rebase --remote

в разделе "git submodule update --remote vs git pull".

MindTooth ' s ответ проиллюстрируйте обновление вручную (без локальной конфигурации):

git submodule -q foreach git pull -q origin master

в обоих случаях это изменит ссылки на подмодули (gitlink, a специальная запись в Родительском РЕПО индекс), и вам нужно будет добавить, зафиксировать и нажать указанные ссылки из основного РЕПО.
В следующий раз, когда вы клонируете это родительское РЕПО, оно заполнит подмодули, чтобы отразить эти новые ссылки SHA1.

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


чтобы избежать этой проблемы, создать ветку, когда вы работаете в каталог подмодулей с работой git checkout-b или чем-то эквивалентным. Когда вы делаете обновление подмодуля во второй раз, он все равно вернет вашу работу, но по крайней мере у вас есть указатель, чтобы вернуться.

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


так, чтобы ответить на ваши вопросы:

могу ли я создавать ветви/модификации и использовать push/pull так же, как и в обычных репозиториях, или есть вещи, о которых нужно быть осторожными?

вы можете создать ветку и нажимаем изменений.

предупреждение (от Git Подмодуль Учебник): всегда публиковать (push) изменение подмодуля перед публикацией (push) изменения в суперпроект, который ссылается на него. Если вы забыли опубликовать подмодуль изменения, другие не смогут клонировать репозиторий.

как бы я продвинул подмодуль, на который ссылается commit, от say (tagged) 1.0 до 1.1 (хотя глава исходного РЕПО уже находится на 2.0)

на странице "Понимание Подмодулей" может помочь

подмодули Git реализованы с использованием двух движущихся частей:

  • the .gitmodules файл и
  • особый вид дерева объект.

они вместе триангулируют определенную ревизию определенного репозитория, который извлекается в определенное место в вашем проекте.


С страница подмодуля git

вы не можете изменить содержание подмодуля из основного проекта

100% правильно: вы не можете изменить подмодуль, относятся только к одному из его совершает.

это почему, когда вы изменяете подмодуль из основного проекта, вы:

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

подмодуль позволяет вам иметь компонентный подход развития, где основной проект относится только к конкретным коммитам других компонентов (здесь "другие репозитории Git, объявленные как субмодули").

подмодуль-это маркер (фиксация) к другому репозиторию Git, который не связан с основным циклом разработки проекта: он ("другое" РЕПО Git) может развиваться независимо.
Это зависит от основного проекта, чтобы выбрать из этого другого РЕПО все, что ему нужно.

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

но основная идея остается: ссылки на конкретные компоненты, которые:

  • иметь свой собственный жизненный цикл
  • есть их собственный набор тегов
  • имеют свое собственное развитие

список конкретных коммитов, на которые вы ссылаетесь в своем основном проекте, определяет ваш конфигурация (это конфигурация управление-это все о, englobing mere Система Контроля Версий)

если компонент действительно может быть разработан в то же время как ваш основной проект (потому что любая модификация в основном проекте будет включать изменение подкаталога и наоборот), тогда это будет не" подмодуль", а слияние поддеревьев (также представленное в вопросе перенос базы устаревшего кода из cvs в распределенный репозиторий), связывая историю двух РЕПО Git вместе.

помогает ли это понять истинную природу подмодулей Git?

чтобы обновить каждый подмодуль, можно вызвать следующую команду. (В корне РЕПО.)

git submodule -q foreach git pull -q origin master

вы можете удалить - q возможность следить за всем процессом.

адрес --перебазировать против-возможность слияния:

допустим, у вас есть супер-РЕПО A и подмодуль B и вы хотите сделать некоторую работу в подмодуле B. Вы сделали свою домашнюю работу и знаете, что после вызова

git submodule update

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

cd B
git checkout -b bestIdeaForBEver
<do work>

между тем, кто-то еще в проекте решил, что последний и наилучшую версию B-это действительно то, что заслуживает. Вы, по привычке, объединяете самые последние изменения и обновляете свои подмодули.

<in A>
git merge develop
git submodule update

Ах нет! Вы снова находитесь в безголовом состоянии, вероятно, потому, что B теперь указывает на SHA, связанный с новым наконечником B, или какой-то другой фиксацией. Если бы только вы имели:

git merge develop
git submodule update --rebase

Fast-forwarded bestIdeaForBEver to b798edfdsf1191f8b140ea325685c4da19a9d437.
Submodule path 'B': rebased into 'b798ecsdf71191f8b140ea325685c4da19a9d437'

теперь эта лучшая идея когда-либо для B была перебазирована на новый commit, и что более важно, вы все еще находитесь в своей ветке разработки для B, а не в a безголовое государство!

(--merge будет объединять изменения от beforeUpdateSHA до afterUpdateSHA в вашей рабочей ветви, в отличие от перебазирования изменений на afterUpdateSHA. )

Git 1.8.2 имеет новую опцию --remote Это позволит точно такое поведение. Работает

git submodule update --rebase --remote

извлекает последние изменения из восходящего потока в каждом подмодуле, перебазирует их и проверяет последнюю версию подмодуля. Как документы это:

--remote

эта опция действительна только для команды update. Вместо использования записали суперпроекты по алгоритму SHA-1, чтобы обновить субмодуль, использовать статус ветвь дистанционного слежения подмодуля.

Это эквивалентно запуску git pull в каждом подмодуле, который, как правило, именно то, что вы хотите.

(скопированный с ответ)

Comments

    Ничего не найдено.