Новый репозиторий git в корневом каталоге для размещения существующего репозитория в подкаталоге

Я работаю над большой базой кода, которая в настоящее время не находится под контролем версий (да, действительно). Я работал над одним компонентом в глубоком каталоге и создавал скрытый репозиторий git для отслеживания моих изменений. Теперь я хочу добавить весь код в исходный элемент управления и создать репозиторий для всего дерева каталогов. Я хочу, чтобы новый внешний репозиторий включал всю историю файлов во внутренний репозиторий. Мне не нужны отдельные проекты или подмодули; Я хочу быть как будто репозиторий был создан в корне дерева кода с самого начала, а внутренний репозиторий никогда не существовал. Я хочу удалить каталог .git в подкаталоге, но предпочел бы не терять историю изменений, которую он содержит.

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

Спасибо.

Ответ 1

Скажем, ваш компонент находится в /project-root/deep/path/to/component. Следующие команды будут делать то, что вы хотите:

cd /project-root/deep/path/to/component
git filter-branch --tree-filter 'mkdir -p deep/path/to/component; git mv file1 file2 file2 deep/path/to/component' HEAD
rm -rf deep
mv .git /project-root
git reset --hard

Тогда, конечно, вы должны добавить файлы для остальной части проекта так же, как обычно.

Ответ 2

Вы можете использовать filter-branch и переместить существующие файлы в текущей истории в подкаталог, где они будут иметь репозиторий, существовавший в корне проекта с начала:

git filter-branch \
--tree-filter '
>/dev/null mkdir -p path/from/project/root/to/current/;
mv * path/from/project/root/to/current/;
# take care of special files, e.g. .gitignore and other hidden files
mv .gitignore path/from/project/root/to/current/;
'
--tag-filter cat \
--all

После того, как это будет завершено, проверьте полученную историю. Если все денди, переместите каталог .git в корневой каталог проекта; вы не должны видеть неустановленные файлы.

Я уверен, что есть более дешевый способ, используя команды t23 > и git, но я не знаю их наизусть.

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