Как изменить подмодуль git, чтобы он указывал на подпапку?

103

Просматривая учебник по SubModule , я создал подмодуль из проекта boto . Затем я обнаружил, что на самом деле мне нужна только часть этого проекта, а именно папка boto .

Я хотел бы изменить свой подмодуль, чтобы он указывал на эту папку. Когда я смотрю в .gitmodules, я вижу

[submodule "backup/src/boto"]
    path = backup/src/boto
    url = https://github.com/boto/boto.git

Какой URL использовать вместо https://github.com/boto/boto.git ? Должен ли я после изменения URL-адреса удалить папку Boto локально и повторно вытащить?

потрошитель234
источник
3
Это не совсем то, что вам нужно - не подмодуль - но вы могли бы взглянуть на негоgit subtree
Cascabel
1
В итоге я получил весь подмодуль и сказал IntelliJ, что папка boto является «исходной папкой», чтобы он мог находить в ней пакеты.
ripper234
15
Я не могу поверить, что git не делает этого изначально ... yikes.
rogerdpack
2
Нашел аналогичный вопрос - stackoverflow.com/questions/1121227/…
sashoalm

Ответы:

66

Боюсь, что URL-адрес подмодулей всегда просто указывает на репозиторий - вы не можете указать, что вам нужна только подпапка репозитория, точно так же, как git не поддерживает «узкие клоны» в целом.

Если вы не можете жить с целым репозиторием в качестве подмодуля, вы всегда можете создать новый репозиторий, клонированный из boto, а затем настроить задание cron для:

  1. git fetch этот репозиторий в каталог
  2. Используйте git filter-branchдля обновления ветки, в которой подкаталог находится на верхнем уровне.
  3. Добавьте эту ветку репозитория как подмодуль. Однако это все немного неудобно, и я бы предпочел просто жить с целым репозиторием в качестве подмодуля.
Марк Лонгэр
источник
24

Вы не можете клонировать только часть репозитория. Это потому, что git рассматривает репозиторий как единый объект: когда вы его получаете, вы получаете все .

Итак, решением здесь было бы получить подмодуль в другом каталоге, а затем использовать символическую ссылку для достижения вашей цели.

Артефакт2
источник
У меня есть символические ссылки в окнах ... тоже хорошо работает. (это из-за msys у меня на машине, поэтому я могу использовать ln -sкак в Linux)
kumarharsh
7
Vista и & поставляются с MKLink. Я использую это. howtogeek.com/howto/windows-vista/…
Энджел С. Морено
1
Вместо этого вы можете использовать жесткие ссылки
KindDragon
15

Что вы хотите сделать, так это создать ветку в подмодуле, переместить папку вверх и удалить то, что вам не нужно. Вместо этого вы можете управлять этой веткой. Если вы хотите поднять свои изменения, вы можете сначала выполнить обратное слияние. Git будет знать, что вы переместили файлы, и успешно выполните слияние.

Надеюсь это поможет.

Адам Димитрук
источник
Что такое «обратное слияние»? Вы можете привести пример?
Sukima
слияние, которое идет «вверх по течению» - от ветви более высокого порядка к ветви более низкого порядка. Линус ненавидит это. Они связаны с историей из других ветвей, которые, возможно, уже были объединены.
Adam Dymitruk 08
Не могли бы вы добавить пример «обратного слияния» в этой ситуации?
Сяо
Обычно это происходит, когда вы пытаетесь поддерживать свою функциональную ветку в актуальном состоянии, объединяя вещи из основной ветки, где все объединяют свои последние изменения. Это плохо, потому что это связывает вашу ветку с работой других. Если продукту требуется ваша ветка, но не одна из других веток интеграции, это невозможно.
Адам Димитрук 09
интересная идея, кто нибудь пробовал такое? Я собираюсь попробовать в ближайшее время, но все еще не уверен, что «обратное слияние» может быть четким и автоматизированным ...
Мудрик