Подтвердить что ты не робот

Автоматически сохранять вторичное репо в синхронизации с основным репо?

У нас есть двухуровневая настройка.

У нас есть первичный репозиторий (называемый "primary" ниже).

И вторичный репозиторий (называемый ниже "вторичным" ), который был создан следующим образом:

$ git clone --bare --shared $REPO_A/primary secondary.git

Люди, работающие во вторичном репозитории, рассматривают ветки, созданные из первичного репозитория, только как прочитанные, но основывают свои ветки на этих ветвях.

Мы хотим синхронизировать вторичный репозиторий с основным хранилищем один раз в день.

т.е. мы хотим, чтобы коммиты и новые ветки были перенесены в первичный, чтобы они стали видимыми для людей, работающих вне вторичного репозитория (в следующий раз, когда они будут тянуть).

Мы не хотим, чтобы это было симметрично, т.е. активность против вторичного репозитория не станет видимой для тех, кто работает с основным репозиторием.

В идеале я хотел бы запустить задание cron, которое запускается на машине с открытым вторичным репозиторием, который каким-то образом извлекает новые данные из первичного и автоматически включает его во вторичный.

Я надеялся, что может быть простой способ сделать это (и я надеюсь, что кто-то здесь скажет мне, что есть).

Если бы я написал script, чтобы сделать это, это сделало бы:

  • Создайте новый клон вторичного.

    $ git clone $REPO_B/secondary
    $ cd secondary
    
  • Получить все свои ветки.

    $ git branch -r | sed 's?.*origin/??'
    
  • Получить все ветки в основном репо.

    $ git ls-remote --heads $REPO_A/primary | sed 's?.*refs/heads/??'
    
  • Для каждой первичной ветки, для которой у меня еще нет соответствующей вторичной ветки:

    $ git fetch $REPO_A/primary $BRANCHNAME:$BRANCHNAME
    $ git push origin $BRANCHNAME:refs/heads/$BRANCHNAME
    
  • Для каждой первичной ветки, для которой у меня уже есть соответствующая вторичная ветвь:

    $ git checkout -b $BRANCHNAME --track origin/$BRANCHNAME
    $ git pull $REPO_A/primary $BRANCHNAME
    $ git push
    

Как я новичок в git, я не удивлюсь, если я не рассмотрю некоторые фундаментальные проблемы?

И, как я уже сказал, я надеюсь, что есть более простой способ сделать это, то есть кто-то идет "о, не делай этого, просто сделай...".

4b9b3361

Ответ 2

Вы можете просто сделать git clone --bare --mirror и периодически делать git fetch, чтобы это произошло.

Я делаю это с помощью инструмента gitmirror Я написал в node.js, что я запускаю на машине дома получать webhooks из github, а также специальные крючки для синхронизации транзакций.

Для примера, отличного от github, у меня есть репо, которое используется для резервной копии couchdb, которая имеет фиксацию примерно один раз в час. Задача cron в основном сводится к следующему:

# do some backup stuff
git commit -qam "Backup `date`" >> dump.log 2>&1

Оттуда у меня есть крюк post-commit (.git/hooks/post-commit), который выглядит так:

#!/bin/sh
curl -sS http://my.home.machine/gitmirror/bak/repo-name.git

Вы можете выполнить одно и то же, нажав с принимающей стороны. Это имеет то преимущество, что стрельба и забывание полезной нагрузки в нормальном случае.