2010-09-08 8 views
26

Mamy konfigurację dwupoziomową.Automatycznie utrzymuj wtórne repo zsynchronizowane z pierwotnym repo?

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

I repozytorium wtórne (zwane „wtórne” poniżej), który został stworzony w taki sposób:

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

Osoby pracujące na wtórnym repozytorium zobaczyć gałęzie, które wywodzi się z pierwotnego repozytorium jak tylko czytać, ale oprzeć własną rękę odgałęzia się z tych oddziałów.

Chcemy zsynchronizować wtórne repozytorium z głównym repozytorium raz dziennie.

tj. Chcemy commits i nowe gałęzie, które zostały wypchnięte do podstawowego, aby stały się widoczne dla ludzi pracujących poza drugim repozytorium (następnym razem, gdy wykonają pull).

Nie chcemy, aby było to symetryczne, tzn. Aktywność w repozytorium wtórnym nie będzie widoczna dla osób pracujących poza podstawowym repozytorium.

Idealnie chciałbym uruchomić zadanie cron, które działa na komputerze z gołym wtórnym repozytorium, które w jakiś sposób pobiera nowe dane z podstawowego i automatycznie włącza je do drugorzędnego.

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

Gdybym miał napisać skrypt, aby to zrobić, by to zrobić:

  • Tworzenie nowego klona wtórnym.

    $ git clone $REPO_B/secondary 
    $ cd secondary 
    
  • Zdobądź wszystkie swoje oddziały.

    $ git branch -r | sed 's?.*origin/??' 
    
  • Uzyskaj wszystkie oddziały w głównym repozytorium.

    $ git ls-remote --heads $REPO_A/primary | sed 's?.*refs/heads/??' 
    
  • Dla każdej głównej gałęzi, dla których nie ma już odpowiednią gałąź wtórnego:

    $ git fetch $REPO_A/primary $BRANCHNAME:$BRANCHNAME 
    $ git push origin $BRANCHNAME:refs/heads/$BRANCHNAME 
    
  • Dla każdej głównej gałęzi, dla których mam już odpowiedni oddział wtórnego:

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

Jako, że jestem nowy w git, nie byłbym zaskoczony, gdyby mi się nie udało o rozważyć pewne podstawowe kwestie?

I jak powiedziałem mam nadzieję, że jest prostszy sposób robienia tego, to znaczy, że ktoś mówi: "Och, nie rób tego wszystkiego, po prostu rób ...".

Odpowiedz

25

Och, nie rób wszystko, po prostu zrobić:

git --bare fetch 

;)

(Zobacz ten old thread for instance)
Jeśli dodał relevant remote origins do gołego repo, można pobrać z kolei każde z tych początków.

+4

To wygląda na to, co chcę. Dzięki za linki - od nich dostałem się: '$ cd secondary.git ; git --bare fetch origin '+ refs/heads/*: refs/heads/*' ' Jako doświadczony haker UNIX zawsze lubię naprawdę rozumieć, w czym jestem. Jednak większość dokumentacji Git wydaje się być naprawdę proste przypadki Alicji i Boba, a wszystko, co jest bardziej złożone, to styl książki kucharskiej, czy możesz polecić dobrą książkę w wersji "dogłębnej" lub dokumentację internetową dla Git? –

+4

@George: tak: http://www.newartisans.com/2008/04/ git-from-th e-bottom-up.html, chociaż http://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide oferuje wiele innych interesujących linków. http://tom.preston-werner.com/2009/05/19/the-git-parable.html też jest fajny. – VonC

+0

Zwróć też uwagę, że te specyfikacje ref znajdują się w Twojej konfiguracji git, więc z 'fetch = + refs/*: refs/*', musisz po prostu wpisać 'git fetch' – Dustin

10

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

Robię to realtimish za pomocą narzędzia o nazwie gitmirror Napisałem w węźle.js, który uruchamiam na komputerze w domu, aby otrzymywać webhooks z github, a także haki ad-hoc do synchronizowania zatwierdzeń.

Dla przykładu non-github, mam repozytorium, które jest używane do tworzenia kopii zapasowych couchdb, które ma zatwierdzenie raz na godzinę. Zadanie cron w zasadzie sprowadza się do tego:

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

Stamtąd mam post-commit (.git/hooks/post-commit), który wygląda tak:

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

można osiągnąć to samo przez naciśnięcie od strona odbierająca. Ma to tę zaletę, że strzelanie i zapominanie ładunku w normalnym przypadku.

+0

Edycja: Dodano "--bare' do linii klonowania od VonC przypomniał mi. Zwykle robię to i zdaję sobie sprawę, że nie zrobiłem "--bare", a następnie ręcznie go przekonwertuję lub zrobię to ponownie. – Dustin

+0

Interesujące opcje tworzenia kopii zapasowych (i bardziej szczegółowa odpowiedź niż moja). +1 – VonC

+1

Sugestia VonC wydaje się robić to, co chcę. Jednak czuję się źle - ponieważ tak naprawdę nie dałem sugestii Dustina, że ​​nie mogę znaleźć niczego, co tłumaczy opcję --mirror w sposób aktywny. E.g. strona podręcznika git-clone mówi nie więcej niż "Ustaw lustro zdalnego repozytorium". Ale co to oznacza rozsądne życie itp.? W jaki sposób klonowane jest repozytorium z --mirror różni się od tego, który nie jest? Zaskakująco Google-ing nie oświeciło mnie :( –