Вопрос по git – Как переименовать git-репо (проект), который содержит подмодули в своих подкаталогах

19

Я никогда не ожидал, что переименование git-репо, которое, в частности, является папкой верхнего уровня, в которой хранится проект, было бы так сложно Да, проект содержит несколько подмодулей, но этоtop-level folder что нужно переименовать, а неsubmodule folder, Git, кажется, записывает некоторые странныеabsolute paths в его подмодульных механизмах.

Предположим, что

All your projects locate in /tmp. You've got a proj_master and proj_mod. You clone porj_master as proj_ALL then clone prom_mod as a submodule in it. You rename proj_ALL to proj_onebillion. Then black magic happens.

Следующие шаги воспроизведут проблему, о которой я говорил. Версия git, которую я использую:

$ git --version
git version 1.7.9.5

Initialize proj_master.

$ cd /tmp
$ mkdir proj_master; cd proj_master
$ git init .
$ touch README
$ git add .; git commit -m "hello proj_master"

Initialize proj_mod.

$ cd /tmp
$ mkdir proj_mod; cd proj_mod
$ git init .
$ touch README
$ git add .; git commit -m "hello proj_mod"

Clone proj_master as proj_ALL and clone proj_mod as a submodule.

$ cd /tmp
$ git clone proj_master proj_ALL
$ cd proj_ALL
$ git submodule add /tmp/proj_mod ./mod
$ git add .; git commit -m "hello proj_ALL"
$ git status   % Everything is OK.

Rename proj_ALL to proj_onebillion. Encounter a fatal error.

$ cd /tmp
$ mv proj_ALL proj_onebillion
$ cd proj_onebillion
$ git status
fatal: Not a git repository: /tmp/proj_ALL/.git/modules/mod

Стоит отметить, что.git файл в каталоге подмодулей.

$ cat /tmp/proj_ALL/mod/.git 
gitdir: /tmp/proj_ALL/.git/modules/mod

Да, абсолютный путь. Впервые я понимаю, что git знает о чем-то, выходящем за рамки папки репо верхнего уровня.

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

Если я пропущу что-то, что должно было быть прочитано раньше, я прошу прощения. Для всех парней, любой совет приветствуется.

Ваш Ответ

4   ответа
1

.git/modules/<path-to-submodule>/config
<path-to-submodule>/.git
4

gitdir.

Он должен быть в папке подмодуля.git файл.

Спасибо, это разобрано для меня.
5

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

Во-первых, у всех подмодулей есть файл .git, в котором они хранят абсолютный путь к своей папке конфигурации git (они находятся в основной папке .git проекта, сгруппированной в папке модулей). Чтобы исправить все это, запустите следующую команду из корня основного проекта:

find . -name .git -print0 -type f | xargs -0 sed -i 's|<OLD PATH>|<NEW PATH>|g'

Во-вторых, файлы конфигурации для подмодулей git имеют строку, в которой сохраняется рабочий каталог, также абсолютный. Чтобы обновить все ссылки сразу, запустите следующую команду из корня основного проекта:

find . -name config -print0 -type f | xargs -0 sed -i 's|<OLD PATH>|<NEW PATH>|g'

Сделаны предположения о том, что ваша ОС представляет собой некую форму * nix, и что у вас установлен пакет sed.

12

clone again

Вместо переименования папки - просто клонировать снова

$ cd /project/original
$ cd ..
$ mkdir moved
$ git init
$ git pull ../original master
$ git submodule init
$ git submodule update

сравнитьoriginal/.git/config вmoved/.git/config и устранить любые существенные различия (недостающие ветви нужно создавать - недостающие пульты просто нужно добавить в файл конфигурации).

fix paths

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

Fix your submodule .git file references.

То есть эти файлы:

$ cd /project/moved
$ find -name .git -type f

Все, что вам нужно сделать, это отредактировать их так, чтобы они указывали на правильный каталог

Fix your submodule .git config files

То есть эти файлы:

$ cd /project/moved
$ find .git/modules/ -name config

Здесь обновитеworktree установка:

[core]
    ...
    worktree = /original/path/submodule

к

[core]
    ...
    worktree = /moved/path/submodule

И это все.

A note about versions

1.7.8 ввел использование файла .git для подмодулей ииспользовали абсолютные пути, это было исправлено в 1.7.10 - поэтому проблема касается только репозиториев git, созданных с использованием git версии 1.7.8 и 1.7.9.

Я заметил, что одна из моих машин использовала относительные пути, но не проверял версии - я добавил эту информацию к ответу после небольшого подтверждающего исследования.
Другие тоже жалуются на эти проблемы. Проверьте"Annoying absolute path for "core.worktree" to submodule", Хорошая новость в том, что в git-1.7.10relative path вернусь иabsolute path уйду Jianwen W.
Спасибо, AD7six. Ваш трюк решает мою проблему. Мне просто любопытно, почему git использует такой неприятный подход («абсолютный путь») в своем недавнем выпуске. Jianwen W.

Похожие вопросы