Что является противоположностью `git filter-branch --subdirectory-filter"?


С помощью git filter-branch --subdirectory-filter можно преобразовать подкаталог из текущего репозитория в отдельный репозиторий. Однако я хотел бы сделать противоположную вещь: создать репозиторий, который будет содержать полное содержимое текущего репозитория в виде подкаталога, сохраняя полную историю, как если бы они всегда были в этом подкаталоге. Я не хочу использовать подмодули, потому что я хотел бы, чтобы этот каталог был полностью неотъемлемой частью репозитория.


Предыстория: мне было поручено с написанием простого скрипта, но объем задачи был расширен, так что теперь этот скрипт становится просто подкаталогом в более крупном проекте. Он также не имеет смысла жить самостоятельно, поэтому решение без подмодулей предпочтительнее.

3 4

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, а также всю историю.