IMO, вы должны использовать подмодули для разделения специфики клиента (активы и т. Д.). Ручное обращение с этим - приглашение к катастрофе
Создайте отдельный репозиторий для каждого клиента и добавьте подмодуль, указывающий на ваше ядро, и на все остальное, что совместно используется ими. Код, который не разделяется между клиентами, не должен принадлежать ни ядру, ни другим совместно используемым подмодулям. Это означает, что каждая (текущая) ветвь, соответствующая клиенту, должна стать отдельным хранилищем. Ведь они независимы друг от друга, и в этом весь смысл.
В итоге вы получите эту иерархию хранилища:
core
/\
/ \
client1 client2
UPDATE :
ВАЖНО: сделайте резервную копию всего, чтобы не было проблем, если что-то пойдет не так.
Все это сильно зависит от вашего сценария. Но ниже приводится идея о том, как выполнить то, что я описал в системе, отличной от Windows:
1) Разделить ваш текущий репозиторий на различные репозитории (например: core, client1, client2 и т. Д.):
cp -R original_repo copy_repo
cd copy_repo
git checkout desired_branch
git filter-branch --prune-empty --subdirectory-filter desired_directory -- --all
Повторите это также для каждого клиентского каталога. В конце этого шага у вас будет отдельный репозиторий для каждой из этих частей (core, client1, client2 и т. Д.).
2) Добавьте новый разделенный репозиторий ядра в качестве подмодуля к каждому из ваших репозиториев client1..clientN:
git submodule add <path_for_core_alone>
git submodule init # Add the submodule to .git/config
git submodule update # Clone the core repository
3) Кофе и прибыль.