Как синхронизировать файлы в двух разных хранилищах git (а не клоны) и поддерживать историю?

Я поддерживаю два разных репозитория git, которым нужно поделиться некоторыми файлами, и я хотел бы, чтобы коммиты в одном репо появлялись в другом. Какой хороший способ сделать это для постоянного обслуживания в каждом репо?

Я был одним из разработчиков perlfaq (Github), и недавно я вступил в роль поддержки ядра Perl документация, которая также находится в git.

Задолго до того, как я начал поддерживать perlfaq, он жил в отдельном репозитории управления версиями. Недавно я преобразовал его в git. Периодически один из perl5-носителей синхронизирует общие файлы в perlfaq repo и perl-репо. Поскольку мы переключились на git, мы немного ленив конвертировали инструменты, и теперь я тот, кто это делает. Пока что два репозитория будут оставаться отдельными.

В настоящее время для синхронизации часто задаваемых вопросов для новой (ежемесячной) версии perl мне почти стыдно говорить, что я просто копирую файлы perlfaq *.pod в perofaq repo и накладываю их на Perl-репо. Это теряет историю и т.д. Кроме того, иногда кто-то вносит изменения в эти файлы в perl-репо, и я в итоге переписываю его (да, проверьте git diff идиот!). Я думаю, что файлы не имеют одинаковых путей в репо, но это то, что я могу изменить.

То, что я хотел бы сделать, в волшебной вселенной радуг и пони, вытаскивает объекты из реппо perlfaq и применяет их в perl-репо, и наоборот, поэтому истории и идентификаторы commit соответствуют каждому.

  • Создание патчей работает, но также много работы по управлению им.
  • Git Подмодули, похоже, работают только для полного внешнего репо
  • Я не нашел что-то вроде внешних svn файлов, но это все равно работало бы в обоих направлениях
  • Мне бы хотелось просто выбрать объекты из одного и вишневого цвета в другой

Какой хороший способ справиться с этим?

Ответ 1

Стратегия слияния поддерева в сочетании с script git поддеревом может помочь здесь. Это будет работать для push и pull.
У этого есть еще проблема слияниями, хотя Git1.7.0 исправит это с помощью опции < -Xsubtree, но все равно стоит посмотреть.

Ответ 2

Я предполагаю, что вам нужна история perlfaq в perl-репо. Я бы сделал это (в perl-репо)

git remote add perlfaq git://perlfaq... # real uri
git checkout perlfaq/master -b perlfaq
git checkout master # or whatever
git merge perlfaq

вопреки распространенному мнению git не должны иметь общую историю для слияния. Я знаю, что я слиял 3+ репо таким образом в regen2. Это может быть болезненным в первый раз. Но после этого это не должно быть слишком болезненно. К сожалению, вы можете объединять только один путь, но, возможно, вы можете, возможно, выбрать патчи с perl repo в perlfaq, если хотите.