Автоматически поддерживать вторичное репо в синхронизации с первичным репо? - PullRequest
29 голосов
/ 08 сентября 2010

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

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

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

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

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

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

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

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

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

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

Если бы я написал скрипт для этого, он бы сделал:

  • Создайте свежий клон вторичного объекта.

    $ 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, я не удивлюсь, если не рассмотрю некоторые фундаментальные проблемы?

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

Ответы [ 2 ]

30 голосов
/ 08 сентября 2010

О, не делай всего этого, просто делай:

git --bare fetch

;)

(см. Эту старую ветку, например )
Если вы добавили соответствующие удаленные источники к своему голому репо, вы можете по очереди получать все эти источники.

12 голосов
/ 08 сентября 2010

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

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

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

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

Оттуда у меня есть ловушка после фиксации (.git/hooks/post-commit), которая выглядит следующим образом:

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

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

...