2013-07-03 10 views
5

Das ist seltsam. Ich versuche, ein Skript zu machen, die jede lokale Niederlassung Kasse wird und Herkunft/Master auf sie rebase.`git branch --list` gibt Dateien zurück?

Das ist also mein Skript:

for br in `git branch -l`; do 
    git checkout $br 
    git rebase origin/master 
done 

Einfach. Aber bevor ich das Drehbuch gemacht, wollte ich sicherstellen, dass `git branch -l` gibt, was ich denke, es zurückkehrt ..... es nicht ist.

git branch -l gibt das korrekte Ergebnis zurück. Aber `git branch -l` gibt tatsächlich alle lokalen Zweige zurück und die Dateien im aktuellen Verzeichnis!

Es gibt sie wie folgt aus:

[list of local branches minus master] [list of files in the current dir] master 

`git branch --list` die gleiche Art und Weise verhält.

Warum passiert das?

Und gibt es einen besseren Weg, Herkunft/Master an alle lokalen Niederlassungen rebase?

+0

Sie sollten wirklich Ihre benutzerdefinierten Aliase in einer Frage wie diese nicht verwenden:/ –

+0

Nur eine kleine Bemerkung: Ich glaube, was Sie eigentlich tun, ist alle Zweige auf Master Rebase, und nicht umgekehrt (nur eine Frage der Notation) – pgilmon

Antwort

9

Das ist eine Art dumme Sache.

git branch --list ein Sternchen vor dem aktuell ausgewählten Zweig setzt; Ihr Shell-Skript interpretiert dies als Platzhalter und fügt die Dateien im aktuellen Verzeichnis zur Liste der Elemente hinzu, die mit Ihrer for-Schleife durchlaufen werden sollen.

Sie können versuchen,

for br in `git branch -l | tr '*' ' '`; do 
    git checkout $br 
    git rebase origin/master 
done 
+0

antlersoft, für die Leute, die keine Aliasing Branch haben, bitte ersetzen Sie br mit Zweig in Ihrer Antwort. Ich weiß, dass dein Skript für Nacht funktionieren wird, aber denke an andere Leute, die das betrachten. Ich habe Ihnen eine Abstimmung gegeben, da es die Frage von Nacht beantwortet. Überlegen Sie auch, ob Sie co zum Auschecken ändern möchten. Vielen Dank! – cforbish

+0

@cforbish - Guter Punkt, ich habe die Änderung vorgenommen – antlersoft

2

Die andere Sache, die Sie tun können, nicht wirklich hier notwendig, aber nützlich für robustere Skripte wie es war, ist git for-each-ref zu verwenden, um die refnames Sie extrahieren möchten. Zum Beispiel ist das Äquivalent von git branch --list minus das Präfix white-space-or-Sternchen:

$ git for-each-ref refs/heads/ --format='%(refname:short)' 

wie in diesem Beispiel:

$ git branch -a 
* master 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/master 
$ git for-each-ref refs/heads/ --format='%(refname:short)' 
master 

Ebenso können Sie erhalten Fernbedienungen (git branch -r) durch refs/remotes/ statt mit von refs/heads/, und Sie können Tags mit refs/tags/ finden. Es gibt sogar zusätzliche Optionen mit for-each-ref entworfen, um Strings vor verschiedenen Programmaktionen zu schützen (nicht in diesem speziellen Fall, siehe die Dokumentation für git check-ref-format und seine Einschränkungen für Zweignamen), die es jedoch ermöglichen, eval auf der Ausgabe von git for-each-ref zu verwenden.