2013-07-03 19 views
5

Questo è strano. Sto provando a creare uno script che esegua il checkout di ogni ramo locale e rebase origine/master su di esso.`git branch --list` restituisce i file?

Quindi questo è il mio script:

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

semplice. Ma prima di creare la sceneggiatura, volevo essere sicuro che `git branch -l` restituisse quello che penso stia tornando ... non lo è.

git branch -l restituisce il risultato corretto. Ma `git branch -l` sta effettivamente restituendo tutto il ramo locale PLUS i file nella directory corrente!

Si ritorna in questo modo:

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

`git branch --list` si comporta allo stesso modo.

Perché sta succedendo?

E c'è un modo migliore per rebase origine/master a tutte le filiali locali?

+0

in realtà non dovresti usare i tuoi alias personalizzati in una domanda come questa:/ –

+0

Solo una piccola osservazione: credo che quello che stai facendo in realtà è la ridefinizione di tutti i rami sul master, e non il contrario (solo una questione di notazione) – pgilmon

risposta

9

Questa è una specie di sciocchezza.

git branch --list sta mettendo un asterisco davanti al ramo attualmente selezionato; lo script della shell lo interpreta come carattere jolly e aggiunge i file nella directory corrente all'elenco di elementi da attraversare con il ciclo for.

Si può provare

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

antlersoft, per le persone che non hanno una proprietà di branching, si prega di sostituire br con branch nella risposta. So che la tua sceneggiatura funzionerà per la Nacht, ma considera altre persone che guardano a questo. Ti ho dato un voto alto come risponde alla domanda di Nacht. Considera anche di modificare il conto alla cassa. Grazie! – cforbish

+0

@cforbish - Buon punto, ho apportato la modifica – antlersoft

2

L'altra cosa che si può fare, non proprio necessario qui, ma utile per gli script più robusti per così dire, è quello di utilizzare git for-each-ref per estrarre i refnames che si desidera. Per esempio, l'equivalente di git branch --list senza il prefisso white-space-o-asterisco sono:

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

come in questo esempio:

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

Allo stesso modo è possibile ottenere telecomandi (git branch -r) utilizzando refs/remotes/ invece di refs/heads/ e puoi trovare i tag utilizzando refs/tags/. Esistono anche opzioni aggiuntive con for-each-ref progettate per proteggere le stringhe da varie azioni del programma (non necessarie per questo caso particolare, vedere la documentazione per git check-ref-format e le sue restrizioni sui nomi delle filiali), ma che consentono di utilizzare eval sull'output di git for-each-ref.