Как включить часть другого репозитория git с помощью git поддерева и слияния обновлений в обоих направлениях

У меня есть два хранилища git, показанные ниже. Первый структурирован как типичный проект python.

foo_repo/
    .git/
    setup.py
    foo/
         __init__.py
         some_code.py
    tests/

bar/
    .git/

Я хотел бы включить каталог foo_repo/foo/ в bar/ в качестве поддерева, и я хочу иметь возможность объединять обновления с foo_repo/foo/some_code.py как из репозитория foo_repo в bar, так и наоборот.

Исходная настройка не так уж плоха. Из каталога foo/ я использую:

git subtree --prefix=foo/ split -b export

Затем у меня есть новая ветвь в foo_repo только с содержимым каталога foo_repo/foo/. Чтобы привести это в панель, я просто перехожу в каталог bar/ и:

git subtree --prefix=foo/ add ../foo_repo/.git export

Теперь, когда я настроен, я хотел бы сделать некоторую разработку кода и сохранить foo/ в актуальном состоянии в обоих репозиториях. Нажав из бара, я думаю, что понял. В каталоге bar/:

touch foo/more_code.py
git add foo/more_code.py
git commit -m "more code"
git subtree --prefix=foo/ push ../foo_repo/.git export

Затем из каталога foo_repo/:

git checkout master
git subtree --prefix=foo/ merge export

Слияние другого пути - это то место, где я застрял. Из foo_repo/:

git checkout master
touch foo/yet_more_code.py
git add foo/yet_more_code.py
git commit -m "yet more code"
???

Где ??? - это команда, которая объединяет каталог foo/ с ветвью export. Тогда из bar/:

git subtree --prefix=foo/ pull ../foo_repo/.git export

Поэтому я в основном ищу линию, которая находится в месте ???, или другой рабочий процесс, который делает то же самое. Я попытался повторить git subtree --prefix=foo/ split -b export_foo тем, что не работает.

Ответ 1

Если вы снова разделите foo/, новые коммиты, созданные для этого поддерева, будут созданы поверх старых коммитов, уже существующих в export, включая слияния, которые необходимы для этого:

git subtree --prefix=foo/ split

Обратите внимание, что при использовании опции -b ветвь не должна существовать ранее, поэтому вам может понадобиться создать новую ветку или позже заставить ее изменить.