Чи є спосіб автоматично мати git submodule update
(або бажано git submodule update --init
викликати, коли git pull
це робиться?
Шукаєте налаштування git config або псевдонім git, щоб допомогти з цим.
Чи є спосіб автоматично мати git submodule update
(або бажано git submodule update --init
викликати, коли git pull
це робиться?
Шукаєте налаштування git config або псевдонім git, щоб допомогти з цим.
Відповіді:
Станом на Git 2.14 , ви можете користуватися ним git pull --recurse-submodules
(і псевдонімом, що завгодно).
Станом на Git 2.15 , ви можете встановити submodule.recurse
значення true, щоб увімкнути бажану поведінку.
Це можна зробити у всьому світі, запустивши:
git config --global submodule.recurse true
git pull
до отримання підмодуля та запуску submodule update
. Це справді має бути прийнятою відповіддю зараз
git config --global submodule.recurse true
git clone
. І ввімкніть його за замовчуванням. Інакше завжди буде величезний опір використанню субмодулів, оскільки люди завжди виходять із синхронізації :-(
commit
, fetch
, pull
і т.д.) призначені для застосування тільки до поточного сховище. підмодуль - це інше сховище, і на нього не повинні впливати команди, виконані у батьківському репозиторії за замовчуванням. це свого роду дизайн-рішення від git-розробника.
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'
Починаючи з 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 config
чоловіча сторінка (1.7.5) (або остання git config
сторінка )git fetch
man man (1.7.5) (або остання сторінка git fetch man )для отримання додаткової інформації.
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
, а не a git submodule update
.
git pull
, а не git fetch
, ця опція тільки робить вибірки рекурсивної. Це не змінить те, що комісія перевіряється в підмодулях взагалі. Так git submodule update
як і раніше, як зазначає @Artem.
Я здивований, що ніхто не згадав про використання гаків для цього!
Просто додайте файли з назвою post-checkout
та post-merge
у свій .git/hooks
каталог відповідних сховищ та введіть у кожне з них:
#!/bin/sh
git submodule update --init --recursive
Оскільки ви спеціально попросили псевдонім, припускаючи, що ви хочете мати його для багатьох сховищ, ви можете створити псевдонім, який додає їх до сховища .git/hooks
для вас.
core.hooksPath
для каталогу гачок , для git-config
отримання детальної інформації див. Документи .
git pull --rebase
:(
Ви можете створити псевдонім для команди 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
}
Як уже згадували інші, ви можете легко встановити це за допомогою:
git config --global submodule.recurse true
Однак якщо ви схожі на мене і маєте складніші .gitconfig
налаштування (основний мій ~/.gitconfig
файл використовується include
для завантаження в інші .gitconfig
файли), і ви ніколи не можете запам'ятати, як конвертувати між git
конфігураційним конфігураційним командним рядком і .gitconfig
форматом, ось як його додати до будь-якого з ваших .gitconfig
файлів:
[submodule]
recurse = true
Єдиний спосіб, яким я зміг отримати оновлені підмодулі та вкладені підмодулі:
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;"
Будь-які пропозиції щодо автоматичного запуску команд чи псевдоніма?