Я бы хотел объединить удаленный репозиторий 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
, в котором я изменил только путь к подкаталогу.