Як змінити віддалений сховище для підмодуля git?


722

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

Я не був би здивований, якщо мені дещо не пощастило і доведеться робити справи вручну, оскільки навіть видалення підмодулів непросте.


8
Примітка. Git 2.25 (1 квартал 2020 р.) git submodule set-url [--] <path> <newurl>
Має

Відповіді:


1010

Вам слід просто відредагувати .gitmodulesфайл, щоб оновити URL-адресу, а потім запустіть, git submodule syncщоб відобразити цю зміну до надпроекту та вашої робочої копії.


22
Це, здається, не оновлює .git / config, принаймні в 1.7.1 або 1.7.3.
Давидтбернал

6
Чи також це оновлення конфігурації URL-адреси підмодуля для попередніх комісій? Наприклад, якщо я перевіряю більш старий документ, чи вкаже це на нові URL-адреси підмодуля?
maxmelbin

62
Використовуйте, git submodule foreach -q git config remote.origin.urlщоб побачити "фактичні" URL-адреси субмодуля
Джоел Пурра

9
Він не оновлювався .git/configдля мене за допомогою git 2.1.0. Я повинен був оновити .gitmodulesі .git/configвручну, перш ніж запустити, щоб оновити git submodule sync --recursiveпідмодуль.
дессеїм

7
Здається, це не вистачає ключового кроку, git submodule update --init --recursive --remoteякий фактично змінює сховище на новий дистанційний
Джейсон Аксельсон,

154

Ці команди будуть виконувати роботу в командному рядку без зміни файлів у локальному сховищі

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Development
git submodule sync
git submodule update --init --recursive --remote

Погляньте на блог щодо скріншотів: Зміна URL-адреси / гілки підмодулів GIT на іншу URL-адресу / гілку того ж сховища


8
Це спрацювало, але мені довелося пам'ятати, щоб змінити зміни на пульт. git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00

5
Ну, це створило для мене жахливий безлад. Команди пройшли непомітно, але власне сховище підмодуля все ще вважає, що його віддаленим є старий (старий URL). Може бути, ці команди повинні супроводжуватися іншими командами в сховищі підмодуля?
Motti Shneor

5
Остання команда трохи екстремальна ... Якщо у вас є підмодулі з підмодулями всередині, це також віддалено оновить підмодулі, що навряд чи вам потрібно.
Baptiste Wicht

7
Зауважте, що вам потрібно замінити Submod на ім’я вашого підмодуля!
Shital Shah

133

Простіше кажучи, вам просто потрібно відредагувати .gitmodules файл, а потім повторно синхронізувати та оновити:

Відредагуйте файл за допомогою команди git або безпосередньо:

git config --file=.gitmodules -e

або просто:

vim .gitmodules

потім повторно синхронізуйте та оновіть:

git submodule sync
git submodule update --init --recursive --remote

6
git submodule update --initпрацював на мене, --remoteсхоже, прив’язує його до ГОЛОВИ віддаленого репо.
Хаїм Елія

95

За допомогою Git 2.25 (Q1 2020) ви можете змінити його.
Див. " Змінений URL підмодуля Git " та нова команда

git submodule set-url [--] <path> <newurl>

Оригінальна відповідь (травень 2009 р., Десять років тому)

Насправді патч був поданий у квітні 2009 року для уточнення gitmoduleролі.

Тож тепер документація на gitmodule ще не включає:

.gitmodulesФайл, розташований в каталозі верхнього рівня робочого дерева мерзотника, являє собою текстовий файл з синтаксисом , відповідним з вимогами -of linkgit: ГИТ-конфігурація 1 .
[NEW]:
Оскільки цим файлом керує Git, він відстежує + записи підмодулів проекту.
Інформація, що зберігається в цьому файлі, використовується як підказка для праймування авторитетної версії запису, що зберігається у файлі конфігурації проекту.
Зміни запису, пов’язані з користувачем (наприклад, для врахування відмінностей у URL-адресах підмодулів через ситуацію в мережі), повинні бути внесені до файлу конфігурації, а зміни запису, які слід поширювати (наприклад, + через переїзд джерела підмодуля), повинні бути внесені до цього файлу .

Це майже підтверджує відповідь Джима .


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

" git submodule sync" додано в серпні 2008 року саме для того, щоб полегшити це завдання при зміні URL-адреси (особливо, якщо важлива кількість підмодулів).
Сценарій асоціації з цією командою досить простий:

module_list "$@" |
while read mode sha1 stage path
do
    name=$(module_name "$path")
    url=$(git config -f .gitmodules --get submodule."$name".url)
    if test -e "$path"/.git
    then
    (
        unset GIT_DIR
        cd "$path"
        remote=$(get_default_remote)
        say "Synchronizing submodule url for '$name'"
        git config remote."$remote".url "$url"
    )
    fi
done

Мета залишається: git config remote."$remote".url "$url"


Я хотів змінити URL-адресу підмодулю лише на цій машині. З батьківського проекту я міг змінити запис .git/config, виконуючи: git config submodule."$submodule_name".url "$new_url" що також описано тут .
joeytwiddle

Що робить необов'язковий подвійний тире git submodule set-url [--] <path> <newurl>?
jeverling

1
@jeverling Вони допомагають окремі опції з параметрів: см stackoverflow.com/a/1192194/6309
VonC

1
Зауважте, що для користувачів Ubuntu зі старшою версією git ви можете використовувати цей PPA для оновлення: launchpad.net/~git-core/+archive/ubuntu/ppa
starbeamrainbowlabs

69

Що для мене працювало (в Windows, використовуючи git версії 1.8.3.msysgit.0):

  • Оновіть .gitmodules із шляхом до нового сховища
  • Видаліть відповідний рядок із файлу ".git / config"
  • Видаліть відповідний каталог у каталозі ".git / module / external"
  • Видаліть сам перевірений каталог підмодуля (не впевнений, що це необхідно)
  • Виконати git submodule initіgit submodule update
  • Переконайтесь, що перевірений підмодуль знаходиться на правильній фіксації, і виконайте це, оскільки ймовірно, що хеш буде іншим

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


2
Дуже дякую за це. Це єдиний, хто працював на мене після того, як я вже керував git submodule update. Після інших відповідей не змінилося б те, що було в режимі ./git/modules/externalредагування, тому спроба оновлення призведе до того, що воно все одно витягне неправильну URL-адресу.
NtscCobalt

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

Ні, це майже напевно не буде знати - вам доведеться знову робити всі кроки після першого. Це якраз те, що я виявив, що працював над зменшенням поточного стану підмодуля. Я не знаю , якщо стан речей змінилося , так як я написав це, розум :)
Бен Хаймерс

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

1
Виконуючи ці кроки та встановивши, що "Видалити перевірений сам каталог підмодулів (не впевнений, що це необхідно)" необхідно, інакше ви зіткнетесь "фатально: Не сховище git: ..." під час запуску оновлення підмодулю git
PiersyP

10

Просто відредагуйте .git / config файл. Наприклад; якщо у вас є "загальний" підмодуль, ви можете зробити це в супермодулі:

git config submodule.common.url /data/my_local_common

Це лише найкращий спосіб, якщо ви намагаєтесь змінити URL для одноразового використання, а не назавжди в суперпроекті. Наприклад, ви хочете клонувати підмодулі з локальних копій на диску.
Енді

4

git config --file=.gitmodules -e відкриває редактор за замовчуванням, в якому можна оновити шлях

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