Ця сторінка GitPro добре підсумовує наслідки оновлення підмодулю git
Під час запуску git submodule update
він перевіряє конкретну версію проекту, але не в межах філії. Це називається мати відокремлену голову - це означає, що файл HEAD вказує безпосередньо на фіксацію, а не на символічну посилання.
Проблема полягає в тому, що ти, як правило, не хочеш працювати в окремому оточенні голови, тому що втратити зміни легко .
Якщо ви робите початкове оновлення підмодулю, виконайте введення в цьому каталозі субмодуля, не створюючи гілки для роботи, а потім знову запустіть оновлення підмодуля 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
Протиgit pull
".
MindTooth «сек відповідь ілюструє оновлення вручну (без локальної конфігурації):
git submodule -q foreach git pull -q origin master
В обох випадках це призведе до зміни посилань на субмодулі ( gitlink , спеціальний запис у батьківському індексі репо ), і вам потрібно буде додати, здійснити та висунути згадані посилання з основного репо.
Наступного разу, коли ви будете клонувати це батьківське репо, воно заповнить підмодулі для відображення цих нових посилань на SHA1.
У решті цієї відповіді детально описана класична особливість субмодуля (посилання на фіксований коміт, який є всією точкою поняття субмодуля).
Щоб уникнути цієї проблеми, створіть гілку, коли ви працюєте в каталозі підмодулів з git checkout -b робота або щось подібне. Коли ви зробите оновлення підмодуля вдруге, воно все одно відновить вашу роботу, але принаймні у вас є вказівник, до якого потрібно повернутися.
Перемикання гілок з підмодулями в них також може бути складним. Якщо ви створюєте нову гілку, додаєте туди підмодуль і повертаєтесь назад до гілки без цього підмодуля, у вас все ще є каталог підмодуля як нерозподілений каталог:
Отже, щоб відповісти на ваші запитання:
чи можу я створити гілки / модифікації та використовувати push / pull так, як я б робив у звичайних репостах, чи є речі, про які варто бути обережними?
Ви можете створити гілки та виправити модифікації.
ПОПЕРЕДЖЕННЯ (з підручника Git Submodule ): Завжди публікуйте (натискайте) зміни підмодулю перед публікацією (push) змін у суперпроект, на який посилається. Якщо ви забудете опублікувати зміну підмодуля, інші не зможуть клонувати сховище.
як би я просунув підмодуль, на який посилається фіксація, від say (tagged) 1.0 до 1.1 (навіть якщо заголовок оригінального репо вже на 2.0)
Сторінка " Розуміння підмодулів " може допомогти
Підмодулі Git реалізовані за допомогою двох рухомих частин:
.gitmodules
файл і
- особливий вид деревного об’єкта.
Вони разом триагулюють конкретну редакцію конкретного сховища, яка перевіряється у певному місці вашого проекту.
З сторінки субмодуля git
ви не можете змінювати вміст підмодулю в межах основного проекту
На 100% вірно: ви не можете змінити підмодуль, посилайтеся лише на один із його елементів.
Ось чому, коли ви змінюєте підмодуль в рамках основного проекту, ви:
- необхідно здійснити і натиснути в межах підмодуля (до модуля вище), і
- потім перейдіть до свого основного проекту та повторно виконайте (для того, щоб цей головний проект посилався на новий підмодуль, який ви тільки що створили та натиснули)
Підмодуль дозволяє розробити підхід на основі компонентів , де основний проект посилається лише на конкретні комісії інших компонентів (тут "інші сховища Git, оголошені як підмодулі ").
Підмодуль - це маркер (фіксація) для іншого сховища Git, який не пов'язаний основним циклом розробки проекту: він ("інше" Git repo) може розвиватися незалежно.
Основний проект залежить від того іншого репо, будь-яке зобов'язання.
Однак, якщо ви хочете, щоб зручно змінити один із цих підмодулів безпосередньо з вашого основного проекту, Git дозволяє це зробити, за умови, що ви спочатку опублікуєте ці модифікації підмодулю до свого оригінального репортажу Git, а потім скористаєтесь своїм основним проектом перегляду на нова версія зазначеного субмодуля.
Але головна ідея залишається: посилання на конкретні компоненти, які:
- мають власний життєвий цикл
- мають власний набір тегів
- мають власний розвиток
Перелік конкретних зобов’язань, на які ви посилаєтесь у своєму головному проекті, визначає вашу конфігурацію (саме про це і полягає у керуванні конфігурацією , що залучає просту систему управління версіями )
Якщо компонент дійсно міг би бути розроблений одночасно з вашим основним проектом (оскільки будь-яка модифікація основного проекту передбачала б зміну підкаталогу, і навпаки), то це був би не "підмодуль", а злиття підкреслень (також представлено у питанні Передача бази спадкового коду з резюме до розподіленого сховища ), пов'язуючи історію двох репортажів Git разом.
Чи допомагає це зрозуміти справжню природу Git Submodules?