Чи є спосіб зробити так, щоб git pull автоматично оновлював підмодулі?


203

Чи є спосіб автоматично мати git submodule update(або бажано git submodule update --initвикликати, коли git pullце робиться?

Шукаєте налаштування git config або псевдонім git, щоб допомогти з цим.



1
Чому псевдонім git кращий псевдонім оболонки?
заношувати

20
псевдоніми git хороші тим, що він інкапсулює команду в просторі імен "git". Ви також можете запитати, чому всі команди git починаються з "git", а не з власних імен.
Лілі Баллард

5
Для тих, хто це знайде, відповіді з високим голосом наразі застаріли. Відповідь Кейн точна: stackoverflow.com/a/49427199/3499424
Джон Нойхаус

Відповіді:


176

Станом на Git 2.14 , ви можете користуватися ним git pull --recurse-submodules(і псевдонімом, що завгодно).

Станом на Git 2.15 , ви можете встановити submodule.recurseзначення true, щоб увімкнути бажану поведінку.

Це можна зробити у всьому світі, запустивши:

git config --global submodule.recurse true

3
Підтверджено в розділі 2.16, встановлення цього значення true призведе git pullдо отримання підмодуля та запуску submodule update. Це справді має бути прийнятою відповіддю зараз
Джон Нойхаус

1
Щоб встановити це в усьому світі:git config --global submodule.recurse true
wintersolutions

14
Мене розчарували субмодулі, потім я це зробив. Зараз вони працюють так, як я б очікував. Чи є причина, що я не думаю про те, що це не поведінка за замовчуванням?
Бен

9
Вони повинні також це дозволити git clone. І ввімкніть його за замовчуванням. Інакше завжди буде величезний опір використанню субмодулів, оскільки люди завжди виходять із синхронізації :-(
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli新疆改造中心法轮功六四事件Сантіллі мерзотник команд (наприклад commit, fetch, pullі т.д.) призначені для застосування тільки до поточного сховище. підмодуль - це інше сховище, і на нього не повинні впливати команди, виконані у батьківському репозиторії за замовчуванням. це свого роду дизайн-рішення від git-розробника.
аніон

113

git config --global alias.pullall '!git pull && git submodule update --init --recursive'

Якщо ви хочете, щоб аргументи передавалися для git pull, використовуйте це замість цього:

git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'

4
не забудьте використовувати "git config --global", якщо ви хочете цей псевдонім у всіх використаних вами репортажах git
yoyo

43

Починаючи з Git 1.7.5, він повинен оновити підмодулі автоматично за замовчуванням, як ви хочете.

[EDIT: за коментарями: нова поведінка 1.7.5 полягає в автоматичному доборі останніх комітетів для підмодулів, але не в оновленніgit submodule updateсенсі). Отже, інформація у цій відповіді є актуальною як основна, але сама по собі не є повною відповіддю. Вам все одно потрібен псевдонім, щоб витягнути та оновити підмодулі в одній команді.]

Поведінка за замовчуванням "на вимогу" полягає в оновленні підмодулів кожного разу, коли ви отримуєте команду, яка оновлює фіксацію підмодуля, і ця комісія вже не знаходиться у вашому локальному клоні.
Ви також можете його оновлювати на кожному завантаженні або ніколи (я вважаю, що поведінка до 1.7.5).
Параметр config для зміни такої поведінки є fetch.recurseSubmodules.

Цей параметр може бути встановлено як булеве значення, або значення on-demand.
Встановлення булевого значення змінює поведінку fetchта pullбеззастережно повторюється в підмодулі, коли встановлено значення true та зовсім не повториться, коли встановлено значення false.

Якщо встановлений в on-demand(значення за замовчуванням), fetchі pull тільки рекурсії в населений подмодуль , коли його суперпроект витягує Комміт , що поновлення еталонного підмодуля в .

Побачити:

для отримання додаткової інформації.

git fetch --recurse-submodules[=yes|on-demand|no]

27
Будьте уважні: як пояснюються нижче наведені відповіді, це лише отримує зміни автоматично, вам все одно доведеться робити оновлення підмодуля, тож відповідь на псевдонім правильна.
Артем

4
@Artem правильний. Ця відповідь, хоча і корисна, не стосується всього питання. Цей параметр просто виконує значення a git fetch, а не a git submodule update.
Ендрю Фер’єр

2
Ця відповідь є дуже оманливою. Навіть при використанні git pull, а не git fetch, ця опція тільки робить вибірки рекурсивної. Це не змінить те, що комісія перевіряється в підмодулях взагалі. Так git submodule updateяк і раніше, як зазначає @Artem.
Марк Амері

31

Я здивований, що ніхто не згадав про використання гаків для цього!

Просто додайте файли з назвою post-checkoutта post-mergeу свій .git/hooksкаталог відповідних сховищ та введіть у кожне з них:

#!/bin/sh
git submodule update --init --recursive

Оскільки ви спеціально попросили псевдонім, припускаючи, що ви хочете мати його для багатьох сховищ, ви можете створити псевдонім, який додає їх до сховища .git/hooksдля вас.


2
Чи є спосіб зробити це глобальним налаштуванням? Або такий, який ви отримуєте автоматично під час перевірки сховища?
Рауль Штеффен

3
В останньому випуску git, 2.9, додано налаштування, назване core.hooksPathдля каталогу гачок , для git-configотримання детальної інформації див. Документи .
taleinat

1
Щодо того, що щось отримано автоматично під час перевірки, я шукав, але нічого подібного не міг знайти. Одне джерело зазначало, що це навмисно не підтримується з питань безпеки, оскільки його можна досить легко використовувати для запуску довільного коду на клієнтських машинах.
taleinat

1
Я бачу, як це може бути проблемою безпеки. Зрештою, я хочу використовувати його для запуску коду, який я програмую на комп’ютерах своїх колег, не вказуючи їх.
Рауль Штеффен

1
Це рішення було моєю першою думкою, але тоді я зрозумів, що воно не охоплюватиме людей, які використовують git pull --rebase:(
Vaz

8

Псевдонім, як запропонував Кевін Баллард, - цілком вдале рішення. Просто викинувши інший варіант там, ви також можете використовувати гачок після злиття, який просто працює git submodule update [--init].


7

Ви можете створити псевдонім для команди git, яка автоматично обробляє оновлення підмодуля. Додайте наступне до свого .bashrc

# make git submodules usable
#   This overwrites the 'git' command with modifications where necessary, and
#   calls the original otherwise
git() {
    if [[ $@ == clone* ]]; then
        gitargs=$(echo "$@" | cut -c6-)
        command git clone --recursive $gitargs
    elif [[ $@ == pull* ]]; then
        command git "$@" && git submodule update --init --recursive
    elif [[ $@ == checkout* ]]; then
        command git "$@" && git submodule update --init --recursive
    else
        command git "$@"
    fi
}

1
Замість псевдоніму для git ви можете додати псевдоніми до git за допомогою команди alias або створивши команди на своєму шляху, які починаються з git- (git-bettermodule)
idbrii

7

Як уже згадували інші, ви можете легко встановити це за допомогою:

git config --global submodule.recurse true

Однак якщо ви схожі на мене і маєте складніші .gitconfigналаштування (основний мій ~/.gitconfigфайл використовується includeдля завантаження в інші .gitconfigфайли), і ви ніколи не можете запам'ятати, як конвертувати між gitконфігураційним конфігураційним командним рядком і .gitconfigформатом, ось як його додати до будь-якого з ваших .gitconfigфайлів:

[submodule]
  recurse = true

0

Єдиний спосіб, яким я зміг отримати оновлені підмодулі та вкладені підмодулі:

git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;

Я намагався створити псевдонім через термінал через дужки, тому мені довелося вручну додати це до .gitconfig for global:

[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"

Будь-які пропозиції щодо автоматичного запуску команд чи псевдоніма?

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