Новый репозиторий 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, но я не знаю их наизусть.
Это перепишет историю, поэтому не используйте этот метод, если ваш репозиторий был разделен между несколькими разработчиками.