Объединить репозиторий git в подкаталог

Я бы хотел объединить удаленный репозиторий git в моем рабочем репозитории git в качестве его подкаталога. Я бы хотел, чтобы полученный репозиторий содержал объединенную историю двух репозиториев, а также чтобы каждый файл объединенного репозитория сохранял свою историю, как это было в удаленном репозитории. Я попытался использовать стратегию слияния поддеревьев, как указано в Как использовать стратегию слияния поддеревьев , но после выполнения этой процедуры, хотя полученный репозиторий действительно содержит объединенную историю двух репозиториев, отдельные файлы, поступающие с удаленного не сохранили свою историю (`git log 'на любом из них просто показывает сообщение« Объединенная ветка ... »).

Также я не хочу использовать подмодули, потому что мне не нужны два объединенных репозитория git

Можно ли объединить удаленный репозиторий git в другой в качестве подкаталога с отдельными файлами, поступающими из удаленного репозитория, сохраняя их историю?

Большое спасибо за любую помощь.

РЕДАКТИРОВАТЬ: В настоящее время я пробую решение, которое использует git filter-branch для перезаписи истории объединенного репозитория. Кажется, это работает, но мне нужно еще немного его протестировать. Я вернусь к отчету о своих выводах.

РЕДАКТИРОВАТЬ 2: В надежде пояснить, что я даю точные команды, которые я использовал со стратегией git subtree, что приводит к очевидной потере истории файлов удаленного репозитория. Пусть A будет репозиторием git, над которым я сейчас работаю, а B - репозиторием git, который я хотел бы включить в A в качестве его подкаталога. Он сделал следующее:

git remote add -f B 
git merge -s ours --no-commit B/master
git read-tree --prefix=subdir/Iwant/to/put/B/in/ -u B/master
git commit -m "Merge B as subdirectory in subdir/Iwant/to/put/B/in."

После этих команд и перехода в каталог subdir / Iwant / to / put / B / in я вижу все файлы B, но git log на любом из них показывает только сообщение фиксации «Объединить B как подкаталог в подкаталоге / Iwant / to / put / B / in». Их файловая история в том виде, в каком она находится в B, потеряна.

То, что кажется работающим (поскольку я новичок в git, могу ошибаться), это следующее:

git remote add -f B 
git checkout -b B_branch B/master  # make a local branch following B's master
git filter-branch --index-filter \ 
   'git ls-files -s | sed "s-\t\"*-&subdir/Iwant/to/put/B/in/-" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                git update-index --index-info &&
        mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD 
git checkout master
git merge B_branch

Команда выше для фильтра -branch взято из git help filter-branch , в котором я изменил только путь к подкаталогу.

72
задан christosc 22 June 2011 в 10:22
поделиться