Git не буде ініціювати / синхронізувати / оновлювати нові підмодулі


113

Ось частина вмісту мого .gitmodulesфайлу:

[submodule "src/static_management"]
        path = src/static_management
        url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
        path = external/pyfacebook
        url = http://github.com/sciyoshi/pyfacebook.git

Однак .git/configмістить лише перше:

[submodule "src/static_management"]
        url = git://github.com/eykd/django-static-management.git

Другий підмодуль ( external/pyfacebook) додав інший розробник у галузі функції. Я успадкував розробку зараз і перевірив галузь функцій. Однак Git не потягне за собою підмодуль. Я спробував:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • Видалення всіх визначених підмодулів із .git/configзапуску git submodule init. Він лише копіює попередній підмодуль і ігнорує новий.
  • Введення нових визначень підмодулів .git/configвручну та в запуску git submodule update. Лише раніше наявні підмодулі намагаються оновити.

у різних комбінаціях, але git просто не оновлюватиметься .git/configна основі нового вмісту .gitmodules, а також не створить external/pyfacebookпапку та витягне вміст підмодуля.

Що я пропускаю? Чи .git/configсправді потрібне вручне втручання (додавання запису підмодуля вручну ), і чому?

Редагувати: ручне втручання не працює. Ручне додавання нового запису на підмодуль .git/configнічого не робить. Новий підмодуль ігнорується.


1
працює 1.7.7.1 і має ту ж проблему: "синхронізація підмодуля git" не оновлює .git / config після зміни на .gitmodules.
Джеймс Приттс

Відповіді:


35

Ви нещодавно оновили до git версії 1.7.0.4? У мене були і зараз у мене є подібні проблеми ...

Редагувати: я вирішив свою проблему, але абсолютно не маю уявлення, де б це була проблема. Я вручну видалив записи підмодулю з обох .git / config та .gitmodules та повторно додав свої підмодулі з кроком використання ususa (git submodule add etc. ...). Працює, але не додає значення до цього потоку.


Мені зараз до 1.7.2, але я вважаю, що у мене виникають проблеми принаймні 1.6.x.
Девід Ейк

І так, подумайте про це, я закінчив робити це, як ви описуєте (я забув, це питання все ще було відкритим!). Якщо ви не проти трохи відшліфувати свою відповідь, я прийму її.
Девід Ейк

9
Це постійна слабкість кишки. Навіть svn краще з зовнішніми.
Peter DeWeese

3
Я думаю, що я теж натрапив на це (теж схожі кроки, нарешті, це виправлять). Єдине, що я помітив - це, додавши його ще раз, а потім виконуючи комміт, сказав: створи режим 160000 lib / jruby-swing-helpers (так?)
rogerdpack

1
Про "режим створення 160000" книга Pro Git говорить про це: "Зауважте режим 160000 для входу в стійку. Це спеціальний режим в Git, який в основному означає, що ви записуєте фіксацію як запис в каталог, а не як підкаталог або файл. " git-scm.com/book/en/Git-Tools-Submodules
Йоганн

92

У мене була така ж проблема - виявилося, що файл .gitmodules був скоєний, але власне фіксований підмодуль (тобто запис ID комісії підмодуля) не був.

Додавання цього вручну, здавалося, зробило трюк - наприклад:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook

(Навіть не виймаючи нічого з .git / config або .gitmodules.)

Потім виконайте це, щоб правильно записати ідентифікатор.

Додавання додаткових коментарів до цієї робочої відповіді: Якщо підмодуль git init або оновлення субмодуля git не працює, то, як описано вище, підмодуль git додає URL-адресу. Перевірити це можна за допомогою

 git config --list

і слід отримати запис підмодуля, який потрібно витягнути, в результаті команди git config --list. Якщо в результаті конфігурації є запис вашого підмодуля, то тепер звичайне оновлення підмодуля git --init повинне тягнути ваш підмодуль. Щоб перевірити цей крок, ви можете вручну перейменувати підмодуль та потім оновити його.

 mv yourmodulename yourmodulename-temp
 git submodule update --init

Щоб дізнатися, чи є у вас місцеві зміни в підмодулі, його можна побачити через статус git -u (якщо ви хочете побачити зміни в підмодулі) або статус git --ignore-підмодулі (якщо ви не хочете бачити зміни в підмодуль).


Для чого external/pyfacebook?
ІгорГанапольський

2
@IgorGanapolsky Це шлях для вашого підмодуля.
yuhua

Це мені допомогло, велике спасибі! Я можу лише додати, що якщо шлях до місця призначення вже існує (що він зробив для мене в результаті спроб інших команд), отримується таке повідомлення, яке просто додає плутанини:'your/local/path' already exists and is not a valid git repo
Майкл Амбрус,

1
один вкладиш для читання записів у "git config --list":git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
Пугган

64

версія git 2.7.4. Ця команда оновлює локальний код git submodule update --init --force --remote


20
Нічого не роблю для мене.
Карло Вуд

1
стосовно git-підмодулю [документація) ( git-scm.com/docs/git-submodule#git-submodule---remote ) вищезазначена команда повинна оновити локальну гілку підмодулів.
palik

1
@palik ти рок!
Денис Трофімов

1
Ви можете оновити окремий модуль за допомогою git submodule update --init --force --remote <module-name>.
Адам

15

Мав те саме питання, коли git ігнорував initі updateкомандує, і нічого не робить.

ЯК ВИРІШИТИ

  1. Ваша підмодульна папка повинна бути передана в git repo
  2. Це не повинно бути .gitignore

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

Якщо ви все це зробили, і це все ще не працює:

  1. Додайте підмодуль вручну, наприклад git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. зафіксувати і натиснути всі файли - .gitmodulesі папку вашого модуля (зауважте, що вміст папки не буде виконуватись)
  5. киньте своє місцеве git repo
  6. клон нового
  7. переконайтесь, що .git/configще немає підмодулів
  8. Тепер, git submodule init- і ви побачите повідомлення, які модуль зареєстрував
  9. git submodule update - вийде модуль
  10. Тепер подивіться, .git/configі ви знайдете зареєстрований підмодуль

1
Я вважаю, що шлях до підмодулів МОЖЕ бути в .gitignore. Принаймні, я змусив це працювати, дотримуючись відповіді від @DaveJamesMiller. Більше нічого не працювало для мене.
gebbissimo

7

Здається, тут багато (і) у відповідях багато плутанини.

git submodule initце НЕ призначене , щоб чарівним чином генерувати речі в .git / конфігурації (від .gitmodules). Він призначений створити щось у абсолютно порожньому підкаталозі після клонування батьківського проекту або витягнення комітету, який додає раніше неіснуючий підмодуль.

Іншими словами, ви слідуєте за git cloneпроектом, який містить підмодулі (про що ви дізнаєтесь, що клон перевірив файл .gitmodules) a git submodule update --init --recursive.

Ви НЕ слідувати git submodule add ...з git submodule init(або git submodule update --init), який не повинен працювати. Насправді додаток уже оновить відповідний .git / config, якщо все працює.

EDIT

Якщо раніше неіснуючий підмодуль git був доданий кимось іншим, і ви виконуєте git pullцю фіксацію, то каталог цього підмодуля буде повністю порожнім (при виконанні git submodule statusхеша нового підмодуля має бути видно, але матиме -перед це.) У цьому випадку вам потрібно слідувати за вашим git pullтакож git submodule update --init(плюс, --recursiveколи це підмодуль всередині підмодуля), щоб перевірити новий, раніше неіснуючий, підмодуль; так само, як після початкового клонування проекту з підмодулями (де, очевидно, раніше ви не мали цих підмодулів).


1
Це цікаво, адже git help submoduleце говорить про init: "init: ініціалізуйте підмодулі, записані в індексі (які були додані та здійснені в інших місцях), копіюючи імена підмодулів та URL-адреси з .gitmodules в .git / config." Отже, це впевнено звучить так, що він повинен робити саме те, що, як ви кажете, не робить ...? Час для оновлення документації на git?
Бред

@brad Я не думаю, що я це сказав - але я додав роз'яснення для конкретного випадку. Дякую.
Карло Вуд

@CarloWood будь-яка ідея, чому письменники git підмодулів вирішили, що --initнеобхідно отримати нові підмодулі (замість того, щоб автоматично захоплювати їх update)? Схоже, оновлення вашого сховища має захопити все необхідне, якщо це не знищить дані. Завдяки --initцьому ви змусили вас знати, що нові підмодулі могли бути створені або просто завжди видавати --initкожен раз, і в такому випадку, здається, що це має бути включено за замовчуванням.
Кацкул

@Catskul Очевидно, я не маю поняття, чому письменники git підмодулів вирішили щось, але я здогадуюсь, що "update" зарезервовано для оновлення чогось, що вже існує, а "init" використовується для створення чогось нового (локально) нового. Під капотом вони, мабуть, істотно відрізняються, щоб гарантувати іншу команду.
Карло Вуд

6

У мене була така ж проблема, але жодне з вищезазначених рішень не допомогло. Записи в .gitmodules та в .git / config були правильними, але команда git submodules update --init --recursiveнічого не робила. Я також видалив каталог підмодулів і запустив git submodules update --init --recursiveі повернув каталог підмодулів назад, але з точно таким же посвідченням, як і раніше.

Я знайшов відповідь на цій сторінці . Команда така:git submodule update --remote


2
Це також було правильним рішенням для мене. Я бігав git submodule updateзамість git submodule update --remote.
Ендрю Медлін

5

Начебто магічно, але сьогодні я побіг git submodule initза ним, git submodule syncа за git submodule updateним почали тягнути мої підмодулі ... Магія? Можливо! Це справді одне з найприємніших вражень від Git ...

Почешіть це. Я насправді працював цим git submodule update --init --recursive. Сподіваюся, це допомагає.

PS: Переконайтеся, що ви перебуваєте в кореневій директорії git, а не в підмодулі.


7
Ні, це для мене абсолютно нічого не робить.
ІгорГанапольський

@IgorGanapolsky Я редагував відповідь вище з тим, що працювало на мене. Дайте мені знати, чи працює це!
Леві Фігейра

Я спробував ваші нові команди, але вони теж нічого не зробили.
ІгорГанапольський

5

Думаючи, що налаштування вручну .gitmodulesдосить, це НЕПРАВНО

Мої місцеві git version 2.22.0станом на це написання.

Тому я підійшов до цієї теми, цікавившись, чому не git submodule initпрацює; Я налаштував .gitmodulesфайл і продовжував робити git submodule init...

ВАЖЛИВО

  1. git submodule add company/project.git includes/projectце потрібно (при додаванні модуля в перший раз), це буде:

    • Додати конфігурацію в .git/config
    • оновити .gitmodulesфайл
    • відстежувати місце підмодуля ( includes/projectу цьому прикладі).
  2. Ви повинні потім git commitпісля додавання підмодуля, це буде здійснювати .gitmodulesі гусеничне місце підмодуля.

Коли проект буде знову клонований, він матиме .gitmodulesі порожній каталог підмодулів (наприклад, includes/projectу цьому прикладі). На даний момент .git/configще немає конфігурації підмодулю, поки git submodule initне запущено, і пам'ятайте, що це працює лише тому, що .gitmodulesAND includes/projectвідслідковуються в основному git repo.

Також для ознайомлення див .:


4

Відповідно до відповіді Дейва Джеймса Міллера, я можу підтвердити, що це працювало на мене. Важливим тут було присвоєння ідентифікаторів підпроектів. Просто для введення в .gitmodules було недостатньо.

Ось відповідна комісія:

https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae


3

У мене була така ж проблема.

.gitmodulesмав підмодуль, але після git submodule initкоманди його не було .git/config.

Виявляється розробник, який додав підмодуль, також додав каталог підмодулів у .gitignoreфайл. Це не працює.


2

Як і ви, я виявив, що синхронізація з підмодулем git не робить те, що ви очікуєте. Лише після явногоgit submodule add повторного повтору зміни URL-адреси підмодуля змінюється.

Отже, я вклав цей сценарій ~/bin/git-submodule-sync.rb :

https://gist.github.com/frimik/5125436

І я також використовую ту саму логіку у кількох сценаріях розгортання git після отримання.

Все, що мені потрібно зробити зараз - це редагувати .gitmodules, потім запустити цей сценарій, і він, нарешті, працює так, як я думав git submodule sync.


Здається, це трапляється лише на деяких репостах ... можливо, через якусь помилку в Git. Мені давно не траплялося в новостворених сховищах, але назад, коли це відбувалося весь час на певних
репостах

2

У мене була така ж проблема сьогодні, і я зрозумів, що тому що я набрав git submodule initтоді, у мене були такі рядки .git/config:

[submodule]
   active = .

Я видалив це і набрав:

git submodule update --init --remote

І все повернулося до норми, мій підмодуль оновлено у своєму підкаталозі, як завжди.


2

Проблема для мене полягає в тому, що попередній розробник repo створив submodules/thingпапку як звичайну папку, тобто коли я намагався запустити git submodule add ..., вона не вдасться:'submodules/thing' already exists in the index але спроба оновити підмодуль також буде невдалою, оскільки він побачив, що шлях не містять підмодуль.

Щоб виправити, мені довелося видалити submodules/thingпапку, здійснити видалення, а потім виконати git submodule addкоманду, щоб правильно її додати:

git submodule add --force --name thing https://github.com/person/thing.git submodules/thing

1

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

Додавання підмодулів і порівняння фіксації підмодуля з тими, що знайдені git show $breaking_commit_sha(пошук рядків, що відповідають regexp ^-Subproject) для коригування за потребою фіксованих речей.


1

Видалення режиму субмодуля dir та його вмісту (папка "зовнішня / pyfacebook"), якщо вона існує раніше, git submodule add ...може усунути проблеми.


1
Це було для мене проблемою. Хтось вчинив папку "підмодуль" просто звичайною папкою, тобто коли я намагався запустити "git submodule add ...", це не вдасться: "" vendor / mobx-state-tree "вже існує в індексі" , але спроба оновити підмодуль також не вдасться, оскільки побачила, що шлях не містить підмодуль). Щоб виправити, мені довелося видалити папку, здійснити видалення, а потім виконати команду git add, щоб правильно її додати.
Венрікс

1

У мене була подібна проблема з підмодулем. Просто не хотілося клонувати / витягувати / оновлювати / що завгодно.

При спробі повторного додавання підмодулю за допомогою git submodule add git@my-repo.git destinationя отримав такий вихід:

A git directory for 'destination' is found locally with remote(s):
  origin        git@my-repo.git
If you want to reuse this local git directory instead of cloning again from
  git@my-repo.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

Отже, я спробував застосувати команду add :
git submodule add --force git@my-repo.git destination

Це спрацювало в моєму випадку.


0

Для запису:
я створив ту саму проблему, додавши порожній сховище як підмодуль. У цьому випадку для підмодулю не було довідкового хешу, що призводить до помилки, описаної оригінальним плакатом.

Примусове додавання сховища після його зобов'язання вирішило проблему (як у публікації Arvids)
git submodule add --force git@my-repo.git destination


0
  • Видаліть підмодуль зі свого .git/config
  • Виконати git submodule initкоманду
  • Перейдіть до каталогу свого підмодуля та запустіть git pull origin master

Це має працювати зараз


0

Просто діліться тим, що працювало для мене:

git clone --recurse-submodules <repository path>

Це клонує віддалений сховище, що вже включає підмодулі. Це означає, що вам не потрібно буде запускати оновлення підмодуля git або init після клонування.


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