Что является противоположностью `git filter-branch --subdirectory-filter"?
С помощью git filter-branch --subdirectory-filter
можно преобразовать подкаталог из текущего репозитория в отдельный репозиторий. Однако я хотел бы сделать противоположную вещь: создать репозиторий, который будет содержать полное содержимое текущего репозитория в виде подкаталога, сохраняя полную историю, как если бы они всегда были в этом подкаталоге. Я не хочу использовать подмодули, потому что я хотел бы, чтобы этот каталог был полностью неотъемлемой частью репозитория.
Предыстория: мне было поручено с написанием простого скрипта, но объем задачи был расширен, так что теперь этот скрипт становится просто подкаталогом в более крупном проекте. Он также не имеет смысла жить самостоятельно, поэтому решение без подмодулей предпочтительнее.
3 ответа:
Самое простое решение-оставить историю в покое: просто поместите все ваши файлы в подкаталог, зафиксируйте это изменение и продолжайте жить своей жизнью.
Если вы действительно хотите притвориться, что все это время выполняли эту работу в подкаталоге, то наименее сложный способ-использовать что-то вроде:
git filter-branch --tree-filter "mkdir SUBDIR && bash -c 'git mv -k {,.[!.],..[!.]}* SUBDIR/'"
Замените SUBDIR именем целевого подкаталога.
Вы можете просто переместить файлы из репозитория подпроектов в каталог, в котором они должны находиться в более крупном репозитории, а затем объединить эти коммиты в конечный репозиторий. Это позволит полностью сохранить историю обоих репозиториев, включая все идентификаторы фиксации.
Это можно сделать с помощью команд, подобных:
cd /path/to/subproject mkdir subproject_dir git mv file1 dir2 dir3... subproject_dir git commit cd /path/to/main_project git pull /path/to/subproject
Используйте команду
git subtree
. Предположим, что у вас есть новое РЕПО:$ cd $ROOT_OF_NEW_REPO $ git subtree add --prefix=subdirectory/for/old/repo <old git repo URL or checkout> <commit ref>
Напр.
$ git subtree add --prefix=history ~/repos/oldrepo HEAD
Каталог
history
будет содержать файлы oldrepo в фиксацииHEAD
, а также всю историю.