Automatycznie utrzymywać synchronizację wtórnego repo z pierwotnym repo?

Mamy układ dwupoziomowy.

Mamy podstawowe repozytorium (zwane poniżej 'podstawowym').

I repozytorium wtórne (zwane poniżej "wtórnym"), które zostało utworzone w ten sposób:

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

Osoby pracujące nad repozytorium wtórnym przeglądają gałęzie, które pochodzą z repozytorium pierwotnego jako Tylko do odczytu, ale opierają swoje własne gałęzie na tych gałęziach.

Chcemy zsynchronizować repozytorium wtórne z repozytorium pierwotnym raz dziennie.

Czyli chcemy commity i nowe gałęzie, które zostały wypchnięte do głównego repozytorium, aby stały się widoczne dla osób pracujących z repozytorium wtórnym (następnym razem wykonają pull).

Nie chcemy, aby było to symetryczne, tzn. aktywność wobec repozytorium wtórnego nie będzie widoczna dla osób pracujących poza repozytorium pierwotnym.

Najlepiej byłoby uruchomić zadanie crona, które działa na maszynie z gołym repozytorium wtórnym, które w jakiś sposób pobiera nowe dane z podstawowego i automatycznie je zawiera do drugorzędnego.

Miałem nadzieję, że może być prosty sposób, aby to zrobić (i mam nadzieję, że ktoś tutaj powie mi, że jest).

Gdybym miał napisać skrypt, który by to zrobił, zrobiłby:

  • Stwórz świeży klon drugorzędnego.

    $ git clone $REPO_B/secondary
    $ cd secondary
    
  • Zdobądź wszystkie jego gałęzie.
    $ git branch -r | sed 's?.*origin/??'
    
  • Zdobądź wszystkie gałęzie w głównym repo.

    $ git ls-remote --heads $REPO_A/primary | sed 's?.*refs/heads/??'
    
  • Dla każdego oddziału podstawowego, dla którego nie mam jeszcze odpowiedniego oddziału wtórnego oddział:

    $ git fetch $REPO_A/primary $BRANCHNAME:$BRANCHNAME
    $ git push origin $BRANCHNAME:refs/heads/$BRANCHNAME
    
  • Dla każdej gałęzi podstawowej, dla której mam już odpowiadającą gałąź drugorzędną:

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

Jako że jestem nowy w git, nie zdziwiłbym się, gdybym nie wziął pod uwagę pewnych fundamentalnych kwestii?

I tak jak powiedziałem, mam nadzieję, że jest prostszy sposób na zrobienie tego, tzn. ktoś powie: "Och, nie rób tego wszystkiego, po prostu zrób...".

Author: Flimzy, 2010-09-08

2 answers

Nie rób tego wszystkiego, tylko rób:

git --bare fetch

;)

(Zobacz ten Stary wątek na przykład )
Jeśli dodałeś odpowiednie Remote origins do nagiego repo, możesz pobrać z kolei każde z tych origins.

 28
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-08 17:14:18

Możesz po prostu zrobić git clone --bare --mirror i okresowo zrobić git fetch, aby tak się stało.

Robię to realtimish używając narzędzia o nazwie gitmirror, które napisałem w node.js, który uruchamiam na komputerze w domu, aby odbierać webhooki z Githuba, a także Hooki ad-hoc do synchronizacji commitów.

Dla przykładu innego niż github, mam repo, które jest używane do kopii zapasowej couchdb, która ma commit około raz na godzinę. Zadanie crona sprowadza się do tego:

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

Stamtąd, mam post-commit hook (.git/hooks/post-commit) to wygląda tak:

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

Możesz osiągnąć to samo, naciskając od strony przyjmującej. Ma to tę zaletę, że w normalnym przypadku można odpalić i zapomnieć o ładunku.

 10
Author: Dustin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-08 17:40:36