Підтискання підмодуля Git


128

Якщо я модифікую підмодуль, чи можу я повернути команду назад на походження субмодуля, чи це потребує клона? Якщо клон, чи можу я зберігати клона всередині іншого сховища?


4
З git 2.7 (січень 2016 року) вам потрібно буде встановити лише один раз git config push.recurseSubmodules on-demand. Тоді достатньо простого git push, щоб просунути все (основні репо і підмодулі). Дивіться мою відредаговану відповідь нижче .
VonC

Надайте зразок коду для того, що ви намагаєтесь зробити.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Відповіді:


138

Підмодуль - це не що інше, як клон git repo в іншому репо з деякими додатковими метаданими (запис дерева в gitlink, файл .gitmodules)

$ cd your_submodule
$ git checkout master
<hack,edit>
$ git commit -a -m "commit in submodule"
$ git push
$ cd ..
$ git add your_submodule
$ git commit -m "Updated submodule"

1
Так, і не забудьте витягнути зміни зі своєї синхронізованої локальної гілки (якщо такі є) перед натисканням. Трапляється, наприклад. під час роботи з gh-pagesвідділенням по документації на github repo :)
NiKo

Я не розумію, як можна записати свій_субмодуль, перш ніж додати свій_субмодуль? Я вважаю, що найкращим способом додати підмодуль був за допомогою команди «додати» git. То чи є інший спосіб додати підмодуль?
MrSo

1
@MrSo Я думаю, що субмодуль вже є, він вкладається в нього, щоб щось змінити в підмодулі.
HattrickNZ

108

Зауважте, що оскільки git1.7.11 ( [ АНОНОС ] Git 1.7.11.rc1 та примітка до випуску , червень 2012 р.) Згадує:

" git push --recurse-submodules" навчився необов'язково вивчати історії підмодулів, прив'язаних до надпроекту, і витісняти їх.

Можливо, зроблено після цього виправлення та --on-demandваріанту:

recurse-submodules=<check|on-demand>::

Переконайтеся, що всі підмодулі, які використовуються для висунення редакцій, доступні у відділенні віддаленого відстеження.

  • Якщо checkвикористовується, буде перевірено, що всі підмодулі, які змінилися в редакціях, що підлягають натисканню, доступні на пульті дистанційного керування.
    Інакше натискання буде скасовано і вийде з ненульовим статусом.
  • Якщо on-demandвикористовується, всі підмодулі, які змінилися в редакціях, які будуть висунуті, будуть висунуті.
    Якщо на вимогу не вдалося підштовхнути всі необхідні зміни, воно також буде скасовано і вийде з ненульовим статусом.

Таким чином, ви можете натиснути все за один раз (від батьківського репо):

git push --recurse-submodules=on-demand

Цей варіант працює лише для одного рівня гніздування. Зміни в підмодулі всередині іншого підмодуля не будуть натиснуті.


З git 2.7 (січень 2016 року) буде достатньо простого натискання на git, щоб натиснути батьківське репо ... та всі його підмодулі.

Див. Комісію d34141c , виконувати f5c7cd9 (03 грудня 2015 р.), Фіксувати f5c7cd9 (03 грудня 2015 р.) Та виконувати b33a15b (17 листопада 2015 р.) Майком Кроу ( mikecrowe) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 5d35d72 , 21 грудня 2015 р.)

push: додати recurseSubmodulesпараметр config

Параметр --recurse-submodulesкомандного рядка існує деякий час, але він не має еквівалентного файлу конфігурації.

Дотримуючись стилю відповідного параметра для git fetch, давайте винаходимо, push.recurseSubmodulesщоб надати цей параметр за замовчуванням.
Це також вимагає додавання, --recurse-submodules=noщоб дозволити змінити конфігурацію в командному рядку, коли це потрібно.

Найпростішим способом здійснення цього є pushвикористання коду submodule-configаналогічним чином fetch.

git configДок тепер включає в себе :

push.recurseSubmodules:

Переконайтесь, що всі підмодулі, які використовуються для висунення редакцій, доступні на гілці віддаленого відстеження.

  • Якщо значення ' check', Git перевірить, що всі підмодулі, які змінилися у виправлених редакціях, доступні принаймні на одному віддаленому від підмодуля. Якщо відсутні будь-які комітети, натискання буде скасовано і вийде з ненульовим статусом.
  • Якщо значення ' on-demand', тоді будуть підсунуті всі підмодулі, які змінилися в редакціях, що підлягають натисканню. Якщо на вимогу не вдалося підштовхнути всі необхідні зміни, воно також буде скасовано і вийде з ненульовим статусом. -
  • Якщо значення "' no", то поведінка за замовчуванням ігнорування підмодулів при натисканні зберігається.

Ви можете змінити цю конфігурацію під час натискання, вказавши " --recurse-submodules=check|on-demand|no".

Так:

git config push.recurseSubmodules on-demand
git push

Git 2.12 (1 квартал 2017 року)

git push --dry-run --recurse-submodules=on-demand насправді спрацює.

Див. Команду 0301c82 , фіксуємо 1aa7365 (17 листопада 2016 р.) Брендоном Вільямсом ( mbrandonw) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 12cf113 , 16 грудня 2016 р.)

push run with --dry-runнасправді (Git 2.11 грудня 2016 р. і нижче / раніше) не виконують сухий прогон, коли натискання налаштоване для натискання субмодулів на вимогу.
Натомість всі підмодулі, які потрібно натиснути, насправді висуваються на їхні пульти, тоді як будь-які оновлення суперпроекту виконуються як сухий запуск.
Це помилка, а не цільова поведінка сухих робіт.

Навчіть pushповажати --dry-runпараметр, коли налаштовано рекурсивно натискати підмодулі "на вимогу".
Це робиться, передаючи --dry-runпрапор дочірньому процесу, який виконує натискання на підмодулі при виконанні сухого пробігу.


І все ж у Git 2.12 тепер у вас є --recurse-submodules=onlyможливість " " виштовхувати підмодулі, не висуваючи суперпроект верхнього рівня .

Див. Команду 225e8bf , фіксуємо 6c656c3 , фіксуємо 14c01bd (19 грудня 2016 р.) Брендоном Вільямсом ( mbrandonw) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 792e22e , 31 січня 2017 р.)


Це доступно зараз, чи не так?
CMCDragonkai

@CMCDragonkai, так, це можна побачити в git-scm.com/docs/git-push . Я відредагував відповідь.
VonC

Чи є рекурсивний вчинок?
CMCDragonkai

1
ви завжди можете зробити "git submodule foreach commit"
reflog

Мені довелося оновити файл .gitmodules з URL-адресами bitbucket.
wclark
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.