2010-10-05 14 views
12

Ustawiłem Github po odebraniu hak, który uruchamia skrypt na moim serwerze sieciowym, gdy push jest do mojego repozytorium Github.Pobieranie wszystkich odległych gałęzi do pustego repozytorium Git

Po uruchomieniu skryptu chcę, aby lokalny nagi klon repozytorium był zsynchronizowany z moim repozytorium Github. Aby to zrobić, muszę go uruchomić polecenie:

git fetch origin && git reset --soft refs/remotes/origin/master

Następnie, jeżeli z mojej stacji roboczej pcham do opanowania na Github, wszystko działa dobrze. Jeśli jednak przesłać do innej zdalnej gałęzi, zmiany nie są odzwierciedlane w lokalnym repozytorium mojego serwera.

Zakładam, że jest jakiś sposób, aby skrypt pobierał wszystkie z odległych oddziałów, ale nie wiem jak to zrobić. Wiem, że nowsze wersje git mają opcję --all do pobierania/ściągania, ale używam git w wersji 1.6.3.3, która nie ma tej opcji.

Czy ktoś wie, w jaki sposób mogę uzyskać mój skrypt do pobrania wszystkich odległych oddziałów?

Dzięki!

+0

"Upgrade to the latest git" wydaje się być dość prostym rozwiązaniem, z pewnością? – Ether

+0

Przypuszczam, że mógłbym to zrobić. Po prostu staram się uniknąć problemów z pakietami Ubuntu. – Tom

Odpowiedz

2

Może użyć skryptu powłoki?

#!/bin/sh 

for i in `git remote show`; do 
    git fetch $i; 
done; 

Uwaga: mały błąd terminologia w swoim pytaniu: Opcja git fetch|pull--all pobiera wszystko „piloty”, a nie „zdalnych oddziałów”.

+0

Dzięki za informacje na --all. Nie zdawałem sobie z tego sprawy. +1 :) – Tom

+0

Git 1.6.3 ma 'git remote update', która jest wbudowaną wersją tego. 'git fetch --all' jest preferowany w wersjach, które go posiadają, ponieważ polecenie * git remote * ma służyć do utrzymywania konfiguracji pilotów, a nie wykonywania na nich akcji (" aktualizacja "jest anomalią pod tym względem, dlatego preferencja dla 'git fetch --all'). –

0

Pomyślałem, że dostarczę własne rozwiązanie, gdy będę na tym. Akceptowałem jednak Ramkumara, jako że było to inspiracją. Różnica polega na tym, że nie chcą się pobrać ze wszystkich pilotów, ale raczej każdy zdalny oddział w „pochodzenie” ...

 

#!/bin/bash 
REMOTE_BRANCHES=$(git branch -r | awk -F'/' '{print $2}') 
for i in $REMOTE_BRANCHES; do 
    git fetch origin $i 
done 
 

ZASTRZEŻENIE: nie naprawdę to jeszcze zrealizowane, ale powinna być zbliżona.

+1

Naprawdę nie powinieneś próbować analizować danych wyjściowych * gałęzi git *. Komenda "hydraulika" niższego poziomu * git for-each-ref * została zaprojektowana dla iteracji skryptowej nad nazwami ref. Jestem zaskoczony, że zwykłe 'git fetch origin' nie aktualizuje wszystkich twoich oddziałów śledzenia" origin/* ". Iterowane zastosowania 'git fetch origin-branch-name' prawdopodobnie nie będą również robić tego, co chcesz. Kiedy dajesz * git fetch * refspec bez dwukropka (ostatni argument jest refspec), przechowuje tylko pobrane zatwierdzenia w specjalnym reforcie FETCH_HEAD (nie zaktualizuje twoich oddziałów zdalnego śledzenia). –

+0

Widzę twój punkt widzenia. Nie wiedziałem o poleceniu git for-each-ref. Dzięki! – Tom

19

git fetch origin '*:*' pracował dla mnie.

+0

To! Nie potrzebujesz pętli. – Piedone

+0

Jeśli chcesz tylko gałęzi, użyj 'refs/heads/*: refs/heads/*'. Jeśli chcesz tylko gałęzie i znaczniki (wykluczając takie rzeczy jak ciągi github), dodaj także 'refs/tags/*: refs/tags/*'. – Patrick

Powiązane problemy