Новый git-репозиторий в корневом каталоге для добавления существующего репозитория в подкаталог
Я работаю над большой базой кода, которая в настоящее время не находится под контролем ревизии (да, действительно). Я работал над одним компонентом в глубоком каталоге и создал скрытое хранилище git для отслеживания моих изменений. Теперь я хочу добавить весь код в систему управления версиями и создать репозиторий для всего дерева каталогов. Я хочу, чтобы новый внешний репозиторий включал всю историю файлов во внутреннем репозитории. Я не хочу отдельных проектов или подмодулей; Я хочу быть таким, как будто репозиторий был создан в корне дерева кода с самого начала, а внутренний репозиторий никогда не существовал. Я хочу удалить каталог.git в подкаталоге, но предпочел бы не потерять историю изменений, которая в нем содержится.
Все, что я прочитал по этой теме, касается слияния существующих репозиториев, а здесь дело обстоит не так, или поддержки субмодулей или удаленных проектов, которые я не хочу.
Спасибо.
2 ответа
Допустим, ваш компонент находится в /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
Затем, конечно, вы должны добавить файлы для остальной части проекта, как обычно.
Вы могли бы использовать 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
каталог в корневой каталог вашего проекта; Вы не должны видеть никаких неподготовленных файлов.
Я уверен, что есть вычислительно более дешевый способ, использующий --index-filter
и git сантехнические команды, но я не знаю их наизусть.
Это перезапишет историю, поэтому не используйте этот метод, если ваш репозиторий использовался несколькими разработчиками.