2011-01-02 5 views
29

Ich habe Tracking-Zweig mit der --track Option einrichten, und wenn ich ein git pull auf master tue, holen sie alle Zweige zu origin/branchname aber mit dem lokalen Tracking-Zweig nicht fusionieren . Das ist besonders ärgerlich, denn wenn ich später eine git push auf master mache, heißt es, dass Non-Fast-Forward-Updates auf die Tracking-Zweige zurückgewiesen wurden, da sie auf der ursprünglichen git pull nicht vorgeholt wurden.Git - Automatische Vorspulen all Tracking-Zweig auf Pull

Meine Frage ist: Wie mache ich es so, dass git pull mit alle Zweige abrufen und automatisch alle Tracking-Zweige vorspulen?

Hinweis: git pull verwendet, um Vorspulen all mein Tracking-Zweig mit meinem GitHub repos, aber jetzt, dass ich meine eigenen repos mit gitolite einrichten, dieses Problem bis sich beschneiden.

+0

Können Sie die genauen Befehle zeigen, die Sie verwenden? Wenn du einen 'git push' auf deinem' master'-Zweig ausführst, solltest du alles außer deinem Master-Zweig drücken und wenn du keine Änderungen an master vorgenommen hast, solltest du nicht versuchen, es zu drücken. –

+1

Ich bin nicht genau sicher, was Ihr Workflow ist, aber meine unmittelbare Reaktion ist, dass Sie keine lokalen Verfolgungszweige erstellen müssen, wenn Sie nicht an ihnen arbeiten (d. H. Der Fall, wo sie schnell weitergeleitet werden können); Die Remote-Tracking-Zweige ('Herkunft/*') werden automatisch aktualisiert und stehen Ihnen in jedem Fall als Referenz zur Verfügung. –

+0

@CharlesBailey Hier ist ein Beispiel: Mehrere Entwickler teilen sich eine Reihe von Zweigen und arbeiten zumindest gelegentlich an ihnen, aber beim Ziehen von Aktualisierungen können die meisten Zweige in der Regel schnell weitergeleitet werden. – bames53

Antwort

5

Aber warten:

Anmerkung: Ich nehme an, Sie alle Ihre Remote-Niederlassungen verfolgt haben, wie in "Track all remote git branches as local branches."


Hinweis: Git 2.0 (Q2 2014) mit commit b814da8 eine Config push.ff vorstellen:

pull.ff:: 

Standardmäßig erstellt Git beim Zusammenführen eines Commits, das ein Nachkomme des aktuellen Commits ist, kein zusätzliches Merge-Commit. Stattdessen wird die Spitze des aktuellen Zweigs weitergeleitet.

  • Wenn auf false Diese Variable teilt Git eine zusätzliche merge commit in einem solchen Fall (äquivalent zu geben dem --no-ff Option aus der Befehlszeile) zu erstellen.
  • Wenn diese Option auf only eingestellt ist, sind nur solche Fast-Forward-Merges zulässig (dies entspricht der Angabe der Option --ff-only über die Befehlszeile).
0

SmartGit zum Beispiel hat eine Option, um automatisch Änderungen aus dem verfolgten Zweig zusammenführen, wenn Sie auf einen Zweig wechseln. Dies sollte tun, was Sie erreichen möchten.

+0

Dieses bestimmte Skript hat auch den unerwünschten Nebeneffekt, dass es den aktuellen Zweig ändert. Gibt es eine Möglichkeit, es zu ändern, um den aktuellen Zweig zu behalten? –

1

Wenn Sie wirklich darauf, alle lokalen Niederlassungen fasten möchten, die Remote-Filialen verfolgen Sie könnten das Hinzufügen dieser als Alias ​​zu Ihrem ~/.gitconfig betrachten wollen:

[alias] 
    pull-all = !"for b in $(git for-each-ref refs/heads --format='%(refname)') ; do git checkout ${b#refs/heads/} ; git pull --ff-only ; done" 

können Sie dann laufen git pull-all, wird es durchlaufen Ihre lokalen Niederlassungen und führen Sie eine git pull --ff-only auf jedem.

+1

Das 'checkout' kann unerwünscht sein, da es eine Aktualisierung der Arbeitsbaumstruktur erfordert, die Updates in IDEs oder anderen Dateien auslösen kann. Um das zu vermeiden, könntest du 'update-ref' stattdessen benutzen, wie hier zu sehen: http://stackoverflow.com/questions/5147537/how-do-i-fast-forward-other-tracking-branches-in-git# 5148202 – joeytwiddle

+0

Ich habe naiv vermutet, dass der Tracking-Zweig Ursprung/$ local_branch ist: 'merge-all =! 'Für local_branch in $ (git für-jedes-ref refs/heads --format = \"% (refname: kurz) \ "); mach remote_branch = \" origin/$ local_branch \ "; local_commit = $ (git rev-parse --verify \" $ local_branch \ "); remote_commit = $ (git rev-parse --verify \" $ remote_branch \ "); common_ancestor = $ (git merge-base $ lokale_branch $ remote_branch); wenn [! \" $ common_ancestor \ "= \" $ local_commit \ "]; echo \" Konnte nicht umgeleitet werden: $ local_branch \ "> & 2; sonst git update-ref refs/heads/$ lokaler_zweig $ remote_commit $ local_commit; fi done" ' – joeytwiddle

8

Shell-Skript, das Vorspulen Alle Branchen, die jederzeit, ohne dabei irgendwelche Auscheckvorgänge

  • es nicht Ihren aktuellen Zweig ändern, keine Notwendigkeit, ihren Upstream-Zweig Satz an die entsprechenden Herkunft/Filiale haben befassen sich mit der Arbeitskopie Änderungen und Zeit verloren Auschecken

  • es nur vorwärts schnell ist, Zweige, die nicht vorgespult werden kann, wird eine Fehlermeldung an und wird

01 übersprungen werden

Stellen Sie sicher, dass alle Zweigstellen Ihrer Zweigstellen korrekt eingestellt sind, indem Sie git branch -vv ausführen. Stellen Sie den Upstream-Zweig mit git branch -u origin/yourbanchname

Copy-Paste in eine Datei und chmod 755:

#!/bin/sh 

curbranch=$(git rev-parse --abbrev-ref HEAD) 

for branch in $(git for-each-ref refs/heads --format="%(refname:short)"); do 
     upbranch=$(git config --get branch.$branch.merge | sed 's:refs/heads/::'); 
     if [ "$branch" = "$upbranch" ]; then 
       if [ "$branch" = "$curbranch" ]; then 
         echo Fast forwarding current branch $curbranch 
         git merge --ff-only origin/$upbranch 
       else 
         echo Fast forwarding $branch with origin/$upbranch 
         git fetch . origin/$upbranch:$branch 
       fi 
     fi 
done;