Перейменуйте підмодуль git


156

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

І хоч ми це робимо, чому я просто не можу зробити наступне в батьківському каталозі: git mv old-submodule-name new-submodule-name


6
Більше не потрібно буде оновлювати .gitmodulesвручну під час переміщення підмодуля. дивіться мою відповідь нижче
VonC

@ Відповідь VonC спрацювала як принадність для мене
laconbass

Модулі Git занадто складні. npmпоказує, як просто працює. Одного разу ... можливо ... хтось ... перепише його ... тим часом ...
Рольф

@ Відповідь VonC - це не повна історія сьогодні: вона дійсно змінить .gitmodules, але просто перейменує шлях, а не ім'я модуля. Вам потрібно додаткове редагування .gitmodules, щоб виправити це, і синхронізацію 'git submodule', щоб завершити повний процес
zertyz

@zertyz: Властивість [підмодуля "name_of_submodule"] - це внутрішнє ім'я Git, ви можете перейменувати його, щоб не плутати себе, але це лише мітка.
МКеспер

Відповіді:


101

Я знайшов наступний робочий процес:

  • Оновлення .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Примітка. Цей підхід не оновлює індекс та .gitmodules належним чином у 2018 році версіях GIT.

Примітка: Ви можете бути в змозі тепер просто зробити git mv oldpath newpathзараз, як зазначено в VonC «s відповідь . (Переконайтеся, що ви використовуєте останню версію git)


22
Зауважте, що для себе: бо git add newpathне використовуйте косою косою рисою
atomicules

10
За допомогою такого робочого процесу ви створите лише посилання на під-каталог, який ви використовуєте як підмодуль. Symlink - це лише частина функціоналу глобального підмодуля. Це означає, що коли ви клонуєте репо, які використовують перейменовані підмодулі, ви можете закінчитися такою помилкою: Не знайдено відображення підмодуля у .gitmodules для шляху 'your-oldpath' Після видалення oldpath (* git rm oldpath ), вам слід використовувати підмодуль git додати REPO-URL newpath замість "git add newpath *. Після закінчення статус git відобразиться приблизно так: перейменовано: oldpath -> newpath
Бертран

5
Це рішення для мене не працює, тому що, використовуючи команду git add, підмодуль включався в проект як простий каталог, а не як підмодуль. спробуйте $ mv submodule-oldpath ~ / other-location $ git rm submodule-oldpath $ git submodule додайте submodule-repository-URL submodule- newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud Адам

3
Якщо у вас є проблеми з робочим деревом, ви також можете відредагувати .git/modules/SUBMODULE/configфайл таким чином, worktreeщоб знову вказувати на правий каталог.
Вінсент Кетелаарс

3
Це не спрацювало для мене з git 2.13.1. Але просто робити git mv old newтвори як шарм. Мені потрібно лише зробити git зобов’язання, щоб завершити зміни.
користувач

226

Git1.8.5 (жовтень 2013 р.) Повинен спростити процес . Просто зробіть:

git mv A B

" git mv A B", під час переміщення підмодуля Aнавчали переміщати своє робоче дерево та коригувати шляхи у .gitmodulesфайлі .


Дивіться більше у комісії 0656781fadca1 :

В даний час використання git mvпідмодуля " " переміщує робоче дерево субмодуля в надпроект. Але налаштування шляху субмодуля .gitmodulesзалишається недоторканим, що зараз не відповідає робочому дереву і змушує команди git, які покладаються на належне path -> name mapping(як statusі diff), поводиться дивно.

Дозвольте git mvтут допомогти " " не тільки переміщенням робочого дерева підмодуля, але й оновленням параметра " submodule.<submodule name>.path" з .gitmodulesфайлу та встановлення обох етапів.
Це не відбувається, коли не .gitmodulesзнайдено жодного файлу, і видає лише попередження, коли в ньому немає розділу для цього підмодуля. Це тому, що користувач може просто використовувати звичайні посилання без .gitmodulesфайлу або вже оновив налаштування шляху вручну перед тим, як надрукувати команду "git mv" (у такому випадку попередження нагадує йому, що mvзробив би це для нього).
Лише коли .gitmodulesбуде знайдено і містить конфлікти злиття, mvкоманда не вдасться і скаже користувачеві вирішити конфлікт перед повторною спробою.


git 2.9 (червень 2016 р.) покращиться git mvдля підмодуля:

Див. Команду a127331 (19 квітня 2016 р.) Від Стефана Беллера ( stefanbeller) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 9cb50a3 , 29 квітня 2016 р.)

mv: дозволяють переміщувати вкладені підмодулі

" git mv old new" не коригував шлях для підмодуля, який живе як підкаталог всередині old/каталогу, правильно.

субмодулі, однак, повинні оновити своє посилання на каталог git, а також оновлення .gitmodulesфайлу.


Примітка до самостійної роботи: Спробуйте це на 1.8.4 і у вас буде fatal: source directory is empty, source=my_source, destination=my_destination. Повторіть спробу, коли 1.8.5 має стабільний випуск.
контрольна сума

@checksum Але в 1.8.5 є стабільний випуск, принаймні, кілька годин;) github.com/git/git/releases/tag/v1.8.5
VonC

Мені довелося створити Git версії 1.8.5.GIT з вихідного коду, оскільки в сховищах Ubuntu є Git v.1.7.5. Як побудувати Git з вихідного коду
Максим Дмитрієв

2
@MaksimDmitriev, а як щодо ppa (Персональний архів пакетів), про який я згадував у stackoverflow.com/a/20918469/6309 ?
VonC

2
git mv просто не працює для цієї мети на моїй машині.
Олександр Дягілєв

13

Правильне рішення:

mv oldpath ~/another-location
git rm oldpath
git submodule add submodule-repository-URL newpath

Джерело: Перейменуйте підмодуль git


2
Ви витягнули це слово за словом з цього місця? bcachet.github.io/development/2012/05/25/rename-git-submodule Якщо так, будь ласка, переконайтесь, що у своїй відповіді введіть атрибуцію цього сайту.
Джордж Стокер

11

Я просто спробував кілька запропонованих вище. Я бігаю:

$ git --version
git version 1.8.4

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

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

Принаймні, це те, що для мене працювало найкраще. YMMV!


7

Перейменувати її неможливо, тому спочатку потрібно видалити її ( deinit) та додати її ще раз.

Тож після її видалення:

git submodule deinit <path>
git rm --cached <path>

Ви також можете двічі перевірити та видалити посилання на нього:

  • .gitmodules
  • .git/config
  • видаліть довідкову папку .git/modules/<name>(найкраще зробити резервну копію), оскільки кожна папка має configфайл, де вона зберігає посилання на їїworktree

потім поетапно змінити зміни, внісши будь-які зміни в репо-рек:

git commit -am 'Removing submodule.'

і перевірте, чи немає у вас непоодиноких проблем:

git submodule update
git submodule sync
git submodule status

тож тепер ви можете знову додати підмодуль git:

git submodule add --name <custom_name> git@github.com:foo/bar.git <my/path>

також це насправді сьогодні
Олексій

Заголовок питань є неправильним, воно стосується шляху, а не імені
Макс Робертце

3

Відредагуйте .gitmodules файл, щоб перейменувати підмодуль, а потім перейменуйте каталог підмодулів.

Я думаю, вам може знадобитися зробити git submodule syncзгодом, але я зараз не в змозі перевірити.


Це призводить до того, що ім'я нового підмодуля виникає як нове фіксування, а не як перейменування. Але, можливо, саме так і має бути?
Ларс Такманн

1
@Lars: Не забудьте також видалити старий каталог підмодулів!
Каскабель

3

Макроси : Коли я хочу використовувати рішення VonC для зміни папки підмодуля Commonна малі регістри:

git mv Common common

я отримав

fatal: перейменування "Common" не вдалося: аргумент недійсний

Рішення - використовуйте назву тимчасової папки та переміщуйте двічі:

git mv Common commontemp
git mv commontemp common

Це все :)

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