2010-10-05 3 views
12

Ich habe einen Github-Post-Receive-Hook eingerichtet, der ein Skript auf meinem Webserver ausführt, wenn ein Push in mein Github-Repository erfolgt.Abrufen aller Remote-Zweigstellen in ein leeres Git-Repository

Wenn das Skript ausgeführt wird, möchte ich, dass es einen lokalen Klon des Repositorys synchronisiert mit meinem Github-Repository hält. Um dies zu tun, ich habe es diesen Befehl ausführen:

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

Wenn dann von meinem Arbeitsplatz schiebe ich auf Github zu meistern, alles funktioniert gut. Wenn ich jedoch zu einem anderen entfernten Zweig dränge, werden die Änderungen nicht im lokalen baren Repository meines Servers widergespiegelt.

Ich nehme an, es gibt eine Möglichkeit, das Skript holen alle der Remote-Niederlassungen, aber ich weiß nicht, wie dies zu tun ist. Ich weiß neuere Versionen von Git haben eine --all Option zum Abrufen/Ziehen, aber ich verwende Git Version 1.6.3.3, die diese Option nicht zu haben scheint.

Weiß jemand, wie ich mein Skript bekommen kann, um alle entfernten Zweige zu holen?

Danke!

+0

"Upgrade auf den neuesten Git" scheint eine ziemlich einfache Lösung, sicher? – Ether

+0

Ich denke, ich könnte das tun. Ich versuche nur, mit den Paketen von Ubuntu nicht fertig zu werden. – Tom

Antwort

2

Verwenden Sie ein Shell-Skript vielleicht?

#!/bin/sh 

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

Hinweis: Kleine Terminologie Fehler in Ihrer Frage: Die --all Möglichkeit git fetch|pull holt alle "Fernbedienungen", nicht "Remote-Niederlassungen".

+0

Danke für die Info auf --all. Habe das nicht bemerkt. +1 :) – Tom

+0

Git 1.6.3 hat 'git remote update', das ist eine eingebaute Version von diesem. 'git fetch --all' ist in den Versionen bevorzugt, die es haben, weil der * git remote * -Befehl dazu gedacht ist, die Konfiguration von Fernbedienungen beizubehalten und keine Aktionen an ihnen auszuführen (' update' ist in dieser Hinsicht eine Anomalie) die Vorliebe für 'git fetch --all'). –

0

Dargestellt würde ich meine eigene Lösung anbieten, während ich dabei bin. Ich habe jedoch Ramkumars akzeptiert, da es die Inspiration dafür war. Der Unterschied ist, ich weiß nicht von allen Fernbedienungen holen will, sondern jede entfernte Niederlassung in „Ursprung“ ...

 

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

HAFTUNGSAUSSCHLUSS: nicht wirklich diese noch nicht umgesetzt, aber es sollte in der Nähe sein.

+1

Sie sollten wirklich nicht versuchen, die Ausgabe von * git branch * zu analysieren. Der untergeordnete "plumbing" -Befehl * git for-each-ref * ist für Skript-Iterationen über ref-Namen gedacht. Ich bin überrascht, dass ein einfacher 'Git-Fetch-Ursprung' nicht alle Ihre "Herkunfts-/*" Fernverfolgungszweige aktualisiert. Iterierte Verwendungen von 'git fetch origin branch-name' werden wahrscheinlich auch nicht das tun, was Sie wollen. Wenn Sie * git fetch * eine refspec ohne Doppelpunkt angeben (das letzte arg ist die refspec), speichert es nur die abgerufenen Commits in der speziellen Referenz FETCH_HEAD (es aktualisiert Ihre Remote-Tracking-Zweige nicht). –

+0

Ich verstehe deinen Standpunkt. Ich wusste nichts über den Befehl git for-each-ref. Vielen Dank! – Tom

19

git fetch origin '*:*' arbeitete für mich.

+0

Dies! Sie brauchen keine Schleifen. – Piedone

+0

Wenn Sie nur Verzweigungen möchten, verwenden Sie 'refs/heads/*: refs/heads/*'. Wenn Sie nur Zweige und Tags (z. B. Github-Pulls) möchten, fügen Sie auch 'refs/tags/*: refs/tags/*' hinzu. – Patrick