2015-02-27 18 views
7

Vorrei vedere se esiste uno dei rami locali appena creati sul telecomando con un comando a una riga. Come fare un alias o una funzione che mi permettesse di digitareVerifica se il ramo locale esiste su Git remoto

git remoteExists <branchName> 

In questo momento mi manualmente elencare fuori ogni ramo sul telecomando e controllare per vedere se la mia filiale locale è lì. Questo non è facile come vorrei dal momento che il nostro telecomando ha centinaia di filiali, molte con nomi simili.

Sto cambiando ramo spesso lavorando su cose diverse, forse 6-7 alla volta, ed è difficile ricordare se ho completato e spinto una filiale o se devo ancora terminarlo.

Ho cercato e trovato alcuni modi per fare cose simili a questo, ma molti sembravano inutilmente complicati, c'è un modo più semplice per farlo?

EDIT

essere chiari su quello che sto facendo. Sto iniziando da una filiale remota e ne faccio una filiale locale. Sto apportando modifiche alla mia filiale locale e spingendo. Non voglio impostare un ramo upstream, poiché non userò più questo ramo; la persona che gestisce il ramo remoto controllerà le mie modifiche e le integrerà nella versione remota.

Questo funziona:

git diff <branchName> remotes/origin/<branchName> 

fatale: ambiguo argomento 'telecomandi/origine/TestReadyBranch': revisione sconosciuta o il percorso non nella struttura di lavoro. Usa '-' per separare i percorsi da revisioni, come questo: 'git [...] - [...]'

Dopo aver visto questo errore avrei saputo che il ramo non esiste il remoto. C'è un modo più pulito per fare questo?

+0

Dando per scontato' in esecuzione su UNIX, le estensioni prompt nel file [git-prompt.sh] (https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh) in 'contrib' ha alcune funzioni che aggiungono queste informazioni al tuo prompt. Molto più veloce di ridigitare ogni volta. –

+0

Se non si imposta l'upstream, è necessario comunicare a Git quale ramo remoto si desidera confrontare il proprio ramo locale. Altrimenti, la tua domanda non ha senso. – Jubobs

+0

@Jubobs. Va bene. Sarebbe solo telecomandi/origine/. Come potrei farlo? – Alex

risposta

5
git fetch origin 
git branch -r --contains $mybranch 

e se sei sicuro eventuali spinte provenienti da questo particolare repo è possibile omettere il recupero.

+0

Esattamente quello che stavo cercando, grazie! – Alex

2

Per controllare se la vostra filiale locale ha cambiamenti contro il ramo di monitoraggio a monte, è possibile eseguire:

git diff @{u} 

Dove @{u} fa riferimento al nome del ramo a monte. Dalla pagina man git-rev-parse(1):

@ {upstream}, ad es. Master @ {monte}, @ {u}

Il suffisso @ {monte} per un branchname (forma breve @ {u}) si riferisce al ramo che il ramo specificato da branchname è impostato per costruire in cima (configurato con branch..remote e branch..merge). Un nome di ramo mancante si imposta automaticamente su corrente.

Questa uscita volontà tipica git diff uscita che mostra le modifiche tra la filiale locale e il ramo di monitoraggio a monte. Se si desidera utilizzare questo come parte di un comando di shell (per esempio, per impostare il prompt o qualcosa del genere), è possibile aggiungere --quiet:

git diff --quiet @{u} 

Ciò restituirà un codice di uscita diverso da zero se non ci sono differenze. Per esempio.:

git diff --quiet @{u} || echo "You need to push your changes!" 
+1

Questo non funziona. Si dice fatale: No upstream configurato per il ramo Alex

+0

In realtà, il messaggio "È necessario inviare le modifiche!" è un po 'fuorviante. Potrebbe essere il caso in cui l'upstream è più avanti rispetto al ramo locale, nel qual caso l'utente deve prima tirare e solo spingere in seguito. – Jubobs

+0

@Alex Devi impostare l'upstream del tuo ramo (usando 'git branch --set-upstream ...'). Se il tuo ramo locale non è associato a nessun ramo remoto, chiedere se hai bisogno di spingere non ha senso. – Jubobs

0

Questo imposterà il codice di uscita di 2 se il lato attuale non esiste sul telecomando:

git ls-remote --heads --exit-code origin "$(git symbolic-ref --short HEAD)" 

Quindi è possibile controllare in guscio:

if [ $? -eq 2 ] 

O in rubino:

if $?.exitstatus == 2 

o analogamente in qualsiasi altra lingua.

0

all'interno della cartella git locale, si può fare

git checkout 

Se non vi sono filiali remote corrispondente, non v'è alcuna uscita. Altrimenti sarà stampare il rapporto tra la sezione locale e remoto (avanti, indietro, a divergere, ecc)

Nota: questo non funziona per 1.8.3.1, ma lavora per 2.16.2

Problemi correlati