Оновіть підмодуль до останньої версії


269

У мене є проект A, який є бібліотекою, і він використовується в проекті B.

Обидва проекти A і B мають окреме сховище на github, але всередині B у нас є підмодуль A.

Я редагував кілька класів у бібліотеці, яка знаходиться в репо А, натиснув на віддалений репо, тому бібліотека (репо А) оновлюється.

Ці оновлення не відбиваються на "посиланні" (підмодулі), що підмодуль посилається на попередній комітет .... що мені робити, щоб оновити підмодуль на git?

Відповіді:


358

Введіть каталог підмодуля:

cd projB/projA

Витягніть репо з проекту A ( не буде оновлено статус git вашого батька, проект B):

git pull origin master

Поверніться до кореневого каталогу та перевірте оновлення:

cd ..
git status

Якщо підмодуль оновлювався раніше, він відображатиметься приблизно так:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

Потім введіть оновлення:

git add projB/projA
git commit -m "projA submodule updated"

ОНОВЛЕННЯ

Як зазначав @paul, оскільки git 1.8 ми можемо використовувати

git submodule update --remote --merge

оновити підмодуль до останньої віддаленої передачі. У більшості випадків це буде зручно.


35
BTW, якщо ви не є власником підмодуля, ви можете просто зробити це, git submodule updateколи хтось інший оновив projA (ви отримаєте новий ідентифікатор комісії).
Kjuly

у мене є головний репо-підмодуль (pro A), але я є виконавцем у програмі B.
жир

@Kjuly Після фіксації, як можна натиснути на пульт? Це просто git push?
KR29

1
@ KR29 справа, і повний cmd є git push <remote> <branch>, наприклад git push origin dev.
Кюли

2
git submodule updateпрацює без прапорів лише тоді, коли витягнуто комісію (у програмі B), яка оновлює рефлекси на відповідний підмодуль (и) (proj A). Щоб оновити proj B на посилання на HEADвіддалену гілку відстеження для pro A, вам потрібно зробити так, git submodule update --remote --mergeяк показано у відповіді Пола Хатчера нижче.
Бен Бернс

109

З git 1.8 ви можете зробити

git submodule update --remote --merge

Це дозволить оновити підмодуль до останньої віддаленої передачі. Потім вам потрібно буде здійснити зміну, щоб посилання gitlink у батьківському сховищі оновлювалось

git commit

А потім натисніть на зміни як без цього, ідентифікація SHA-1, що вказує на підмодуль, не буде оновлена, і тому зміни не будуть видимі ні для кого іншого.


Незважаючи на те, що я git commitвсе ще не бачу. On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
Макс N

1
Чи зробили ви "git push" після вашого вчинення, майте на увазі, що здійснюєте лише зміни вашого локального сховища, вам доведеться виштовхнути його в пульт, щоб усі його побачили
Пол Хетчер

Відсутній у цій відповіді (але зазначено в інших відповідях нижче): оновлений підмодуль (ів) потребує поетапних дій git addперед початком вчинення.
Джошн

1
@joshng Я відчуваю, що кожен, хто знаходиться в точці, де вони працюють над субмодулями, зрозумів би це. Це єдиний пост, який мені допоміг, дуже дякую.
Хеск Рекомс

38

Якщо ви оновите підмодуль і покладете на нього зобов’язання, вам потрібно перейти до вмісту або репо вищого рівня та додати зміни.

git status

покаже щось на кшталт:

modified:
   some/path/to/your/submodule

Те, що підмодуль не синхронізований, також можна побачити з

git submodule

вихід покаже:

+afafaffa232452362634243523 some/path/to/your/submodule

Плюс вказує на те, що ваш підмодуль вказує попереду, де очікується, що його вказує верхнє репо.

просто додайте цю зміну:

git add some/path/to/your/submodule

і зробити це:

git commit -m "referenced newer version of my submodule"

Коли ви натискаєте свої зміни, переконайтеся, що ви спочатку натисніть на зміни в підмодулі, а потім натисніть на зміну посилання у зовнішньому репо. Таким чином люди, які оновлюються, завжди зможуть успішно працювати

git submodule update

Більше інформації про підмодулі можна знайти тут http://progit.org/book/ch6-6.html .


Якщо +під час запуску ви не бачите git submodule, переконайтеся, що ви ініціалізували та імпортували підмодулі. Команди для цього є git submodule initі git submodule update, відповідно.
fureigh

19

Однорядкова версія

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"

2

Деякі з інших відповідей рекомендують об'єднувати / виконувати в каталозі підмодуля, що IMO може стати трохи безладним.

Припускаючи, що віддалений сервер названий, originі ми хочемо, щоб masterгілка підмодуля (ів), я схильна використовувати:

git submodule foreach "git fetch && git reset --hard origin/master"

Примітка. Це призведе до жорсткого скидання на кожному підмодулі - якщо ви цього не хочете, ви можете змінити --hardна --soft.


1

Мій проект повинен використовувати «останнє» для підмодуля. На Mac OSX 10.11, git версії 2.7.1, мені не потрібно було заходити "в" мою папку підмодуля, щоб зібрати її коміти. Я просто робив звичайну

git pull --rebase 

на верхньому рівні, і він правильно оновив мій підмодуль.


0

Відповідь Енді спрацювала для мене, втекла з $ path:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"

Ймовірно, причиною, чому відповідь @Andy Webov не вимагає втечі, полягала в тому, що вони використовували одинарні лапки навколо шляху, наприклад. '$path'
S0AndS0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.