Як додати підмодуль до підкаталогу?


310

У мене є git repo in ~/.janus/з купою підмодулів у ньому. Я хочу додати підмодуль в ~/.janus/snipmate-snippets/snippets/, але коли я запускаю git submodule add <git@github.com:...>в snipmate-snippetsкаталог, я отримую таке повідомлення про помилку:

You need to run this command from the toplevel of the working tree.

Тож питання: Як додати підмодуль до snipmate-snippetsкаталогу?


Перехід до кореневого каталогу git repo для команд підмодуля вже не буде вимогою (незабаром). Дивіться мою відповідь нижче
VonC

3
git submodule add -b <branch> <url> <relative_path_4m_root>
парасити

Відповіді:


438

Ви заходите ~/.janusі біжите:

git submodule add <git@github ...> snipmate-snippets/snippets/

Якщо вам потрібна додаткова інформація про підмодулі (або git взагалі), ProGit дуже корисний.


здається, що додати гілку при додаванні в іншому випадку HEAD легко відокремлюється: git submodule add -b <branch> <repository> [<submodule-path>]
deann

1
Для мене це було причиною 'subprojects' already exists in the index (я використовував підпроекти як ім'я каталогу) . Замість того, що допомогло, є відповідь VonC нижче, тобто робити cd subprojects, а потім git submodule add <get@github …>без шляху.
Привіт-Ангел

83

Зауважте, що, починаючи git1.8.4 (липень 2013 року), вам більше не доведеться повертатися до кореневого каталогу.

 cd ~/.janus/snipmate-snippets
 git submodule add <git@github ...> snippets

( Bouke Versteegh коментує, що вам не потрібно користуватися /., як у snippets/.: snippetsдостатньо)

Див. Комісію 091a6eb0feed820a43663ca63dc2bc0bb247bbae :

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

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

Оскільки інтерпретація відносної URL-адреси підмодуля залежить від того, remote.origin.urlналаштована чи ні, " " явно блокуйте відносні URL-адреси в " git submodule add", коли вони не знаходяться на верхньому рівні робочого дерева.

Підписаний: Джон Keeping

Залежить від комісії 12b9d32790b40bf3ea49134095619700191abf1f

Це змушує " git rev-parse" вести себе так, ніби він викликався із зазначеного підкаталогу сховища, з тією різницею, що будь-які шляхи файлів, які він друкує, мають префікс повним шляхом до вершини робочого дерева .

Це корисно для скриптів оболонки, де ми можемо захотіти до cdвершини робочого дерева, але нам потрібно обробляти відносні шляхи, задані користувачем у командному рядку.


Щиро дякую! Я помітив, що трейлінг /.не потрібен, git створить фрагменти каталогу без нього.
Bouke Versteegh

@BoukeVersteegh Цікаво. Я включив ваш коментар у відповідь для більшої наочності.
VonC

Я перебуваю на git версії 2.7.4, але все-таки отримую це повідомлення про помилку Relative path can only be used from the toplevel of the working tree. Я роблюgit submodule add ../../../functest
FlyingAura

@ user3426358 так, це очікувано: відповідь вище os про можливість робити git submoduel додати з будь-якої підпапки головного репо, а не лише з його кореневої папки. Йдеться не про посилання на віддалений репо-підмодуль з відносним шляхом. Якщо ви зробите це, ви отримаєте повідомлення про помилку, яке ви бачите.
VonC

@ user3426358 І до речі, це повідомлення про помилку (що ви бачите: " Relative path can only be used from the toplevel of the working tree") не є оригінальним питанням (" You need to run this command from the toplevel of the working tree")
VonC

17

У мене була схожа проблема, але я намалював себе в куточку з інструментами GUI.

У мене був підпроект із кількома файлами, які я досі просто копіював, замість того, щоб перевіряти їхнє власне gpo repo. Я створив репо в підпапці, міг добре робити, натискати тощо. Але в батьківській репо-папці папка не розглядалася як підмодуль, і її файли все ще відслідковувалися батьківським репо-репортажем - нічого поганого.

Щоб вийти з цього безладу, мені довелося сказати Git припинити відстежувати папку (не видаляючи файли):

proj> git rm -r --cached ./ui/jslib

Тоді мені довелося сказати, що там є підмодуль (який ви не можете зробити, якщо щось там відстежується git):

proj> git submodule add ./ui/jslib

Оновлення

Ідеальний спосіб впоратися з цим включає ще кілька кроків. В ідеалі існуюче репо переміщується у свою власну директорію, без будь-яких батьківських git-модулів, вчиняється та висувається, а потім додається як підмодуль на зразок:

proj> git submodule add git@bitbucket.org:user/jslib.git ui/jslib

Це клонуватиме git repo як підмодуль - що включає стандартні кроки клонування, а також ще кілька інших незрозумілих кроків конфігурації, які git виконує від вашого імені, щоб змусити цей підмодуль працювати. Найважливіша відмінність полягає в тому, що він розміщує там простий .git-файл, а не каталог .git, який містить посилання на шлях, де живе справжній git dir - як правило, у корені батьківського проекту .git / module / jslib.

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

Отже, переміщення, натискання, git add submodule - це найчистіший варіант.


16

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

.git / config (персональна конфігурація)

[submodule "cookbooks/apt"]
    url = https://github.com/opscode-cookbooks/apt

.gitmodules ( дозволена спільна конфігурація)

[submodule "cookbooks/apt"]
    path = cookbooks/apt
    url = https://github.com/opscode-cookbooks/apt

Дивіться також це - різниця між .gitmodules та зазначенням підмодулів у .git / config?


2

скрипт bash з одним лайнером, який допомагає відповісти на відповідь Кріса вище, оскільки я малював себе в кутку, а також використовуючи оновлення Vundle для моїх .vim сценаріїв. DESTце шлях до каталогу, що містить ваші підмодулі. Робіть це після виконанняgit rm -r $DEST

DEST='path'; for file in `ls ${DEST}`; do git submodule add `grep url ${DEST}/${file}/.git/config|awk -F= '{print $2}'` ${DEST}/${file}; done

ура

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