2017-02-03 2 views
3

В оригинальном файле .gitmodules используются жестко закодированные URL-адреса https, но для некоторых автоматических тестов я клонировал от ssh и сделал URL-адреса субмодуля относительно, как в ../ModuleName. Я также не хочу возвращать эти изменения обратно в репо.Как изменить git subodules url локально?

# change the https://github.com/ with [email protected]: 
sed -i 's/https:\/\/github.com\//[email protected]:/g' ".git/config" 
# delete the url lines from the submodule blocks of .git/config 
sed -i '/submodule/ {$!N;d;}' ".git/config" 
# change hardcoded https:// urls of submodules to relative ones 
sed -i 's/https:\/\/github.com\/ProjName/../g' ".gitmodules" 
# also make the same change in the .git/modules/*/config 
sed -i 's/https:\/\/github.com\/ProjName/../g' .git/modules/*/config 
# sync and update 
git submodule sync 
git submodule update --init --recursive --remote 

С фрагментом выше, он делает то, что я хочу. Однако, назойливая вещь: папка .git/modules/, похоже, не находится под управлением версии, но если я просто ее удалю, git submodule sync и большинство других операций Git просто перестают работать.

Есть ли способ получить .git/modules регенерированный после изменения .gitmodules и .git/config файлов?

ответ

7

Если вы хотите изменить URL-адрес, используемый для подмодуля только для локального репо, то не изменяйте файл .gitmodules, то есть только для изменений, которые вы хотите нажать.

Вместо первой инициализации локальный подмодуль конфигурации:

git submodule init 

Затем измените .git/config файл, чтобы изменить подмодуль URL, как обычно. (Опять же, нет необходимости изменять .gitmodules здесь, и если это новый клон вы, вероятно, не будете иметь .git/modules еще.)

Как @jthill points out, более простой способ, чтобы изменить подмодуль URL, является:

git config submodule.moduleName.url ssh://[email protected]/path 

На данный момент вы не хотите хотите запустить git submodule sync, потому что это заменит сделанные вами изменения со значениями из файла .gitmodules. Вместо этого перейдите прямо к:

git submodule update --recursive --remote 
+0

Да, это ответ на мой первоначальный вопрос и спасибо очень много. Как немного другой вопрос, есть ли способ воссоздать папку '.git/modules', если она каким-то образом перепуталась? Потому что, как только он будет создан, если я удалю его вручную, почти все команды git будут расстроены с этого момента. –

+0

@abdus_salam Возможное решение [здесь] (// stackoverflow.com/a/36983168/2747593). –

0

Я пробовал вышеуказанное решение, но по какой-то причине был беспорядок. Ниже приводится альтернатива.

В новом хранилище:

  1. git submodule init
  2. Инициализировать каждый подмодуль вручную с git clone ../local/path/to/submodule.git path/in/repo/submodule

В случае изменения корня хранилища подмодуль хэши и вам нужно синхронизировать подмодуль:

  1. Обновление корневого репозитория
  2. git submodule update с возможно --force и --recursive для ровного
Смежные вопросы