C'è un modo migliore per scoprire se esiste un ramo git locale?


192

Sto usando il seguente comando per scoprire se esiste un ramo git locale con branch-namenel mio repository. È corretto? C'è un modo migliore?

Si noti che lo sto facendo all'interno di una sceneggiatura. Per questo motivo, se possibile, vorrei utilizzare i comandi idraulici .

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 

Il tuo comando sembra quello che avevo usato.
Paŭlo Ebermann,

6
Nella mia ignoranza, sarei andato con git branch | grep -w <branch-name>. Ok, è un comando di porcellana, ma non riesco a immaginare che questo particolare utilizzo possa cambiare in modo significativo in futuro per rendere inutilizzabile questo frammento ...
UncleZeiv

@UncleZeiv: probabilmente hai ragione sul fatto che il comando non cambierebbe in modo significativo per renderlo inutilizzabile. Ho un po 'un disturbo ossessivo compulsivo su cose come la porcellana contro l'impianto idraulico, tutto qui.
Manoj Govindan,

10
git rev-parse --verify <branch_name>verifica anche altri riferimenti come tag e hash di commit, quindi anche se potrebbe essere più adatto a ciò di cui hai bisogno, restituirà falsi positivi se sei interessato solo ai rami.
Paul S.

2
Solo git show-ref sta lavorando per determinare se è presente un ramo LOCAL. Nell'aggiornamento (sintassi con git rev-parse), anche il codice di ritorno è 0 se un ramo remoto corrisponde.
Fabien Bouleau,

Risposte:


57

Per quanto ne so, è il modo migliore per farlo in una sceneggiatura. Non sono sicuro che ci sia molto altro da aggiungere a questo, ma potrebbe anche esserci una risposta che dice semplicemente "Quel comando fa tutto quello che vuoi" :)

L'unica cosa di cui potresti fare attenzione è che i nomi dei rami possono contenere caratteri sorprendenti, quindi potresti voler citare <branch-name>.


1
buon punto per la citazione <branch-name>. FWIW Sto usando questo in uno script di tessuto. Ricorderò di citare la variabile.
Manoj Govindan,

La risposta corretta è implicitamente questa: git show-ref --verify --quiet refs / heads / <branch-name> mostrerà che HEAD non è un ramo correttamente. git rev-parse --verify ti dirà che HEAD è un ramo esistente. Falso perché HEAD non è un ramo.
Paulo Neves,

106

Quando cerco "git controlla se esiste un ramo" su un motore di ricerca, questa pagina è la prima che vedo.

Ricevo quello che voglio, ma vorrei fornire una risposta aggiornata poiché il post originale era del 2011.

git rev-parse --verify <branch_name>

Questo è essenzialmente lo stesso della risposta accettata, ma non è necessario digitare "refs / heads /"


20
Solo una nota: git rev-parse --verifyti dice solo se esiste un oggetto del genere nel repository (ovvero restituirà 0 per qualsiasi valore <branch_name>che si traduce in un oggetto di qualsiasi tipo nel repository). Non ti dice se quell'oggetto è un ramo o no.
Tavnab,

9
Questa non è una risposta corretta alla domanda, che sta chiedendo come sapere se esiste un ramo. Questo ti darà un falso positivo per un tag. Puoi facilmente provarlo tu stesso. È necessario refs / head / per distinguere dai tag che si trovano in refs / tag e persino i telecomandi in ref / telecomandi.
msouth,

15
git rev-parse --verify gh-pages mi dà: fatale: avevo bisogno di una singola revisione
SuperUberDuper

@SuperUberDuper hai provato: git rev-parse --verify ** origin / ** gh-pages?
RoyalBigMack,

32

Quasi lì.

Basta lasciare --verifye --quiete si ottiene l'hash se il ramo esiste o niente se non lo fa.

Assegnalo a una variabile e controlla se c'è una stringa vuota.

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi

10
Il valore restituito è sufficiente: non è necessario passare attraverso il possibile sforzo di assegnazione a una variabile.
msouth,

15

Penso che tu possa usare git show-branchqui.

$ git show-branch --list
  [master] test
* [testbranch] test
$ git show-branch testbranch
[testbranch] test
$ echo $?
0
$ git show-branch nonexistantbranch
fatal: bad sha1 reference nonexistantbranch
$ echo $?
128

Quindi, $? == 0 indica che esiste la diramazione e non è necessario scavare nell'impianto idraulico di refs / head / a tutti. Finché non passi -ra show-branch, funzionerà solo su filiali locali.


5
AFAIK git show-branchè un comando di porcellana . Come ho detto nella mia domanda, preferirei non usare i comandi di porcellana in uno script se sono disponibili equivalenti idraulici. Vedi kernel.org/pub/software/scm/git/docs
Manoj Govindan

3
@Manoj: conosco la porcellana rispetto all'impianto idraulico, ma non avevo mai letto che l'impianto idraulico fosse considerato più stabile della porcellana. Grazie per avermi indicato questo nei documenti.
Mark Drago,

Per evitare di trovare i tag per errore e per essere più specifici sul fatto che il ramo sia locale o remoto, è possibile specificare git show-branch refs/heads/[branch]o git show-branch refs/remotes/origin/[branch].
twasbrillig,

14

Mi raccomando git show-ref --quiet refs/heads/$name.

  • --quiet significa che non c'è output, il che è positivo perché puoi controllare in modo pulito lo stato di uscita.

  • refs/heads/$namelimiti alle filiali locali e corrisponde ai nomi completi (altrimenti devcorrisponderebbe develop)

Utilizzo in uno script:

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi

Sì, questo è l'unico che lo fa silenziosamente. La denominazione dei comandi git è un po 'strana tbh
smac89,

11

Per l'uso in uno script:

git show-ref -q --heads <branch-name>

Questo uscirà 0se e solo se <branch-name>esiste come una filiale locale.

Esempio:

if git show-ref -q --heads <branch-name>; then
   echo 'Branch exists'
fi

2

Sullo script batch di Windows è leggermente diverso,

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)

1

Chiamiamolo git is_localbranch(è necessario aggiungere alias in .gitconfig).

Uso:

$ git is_localbranch BRANCH

Fonte:

git branch | grep -w $1 > /dev/null
if [ $? = 0 ]
then
  echo "branch exists"
fi

1

Il risultato della recensione sulla mia "Modifica suggerita" all '"Aggiornamento" alla domanda iniziale era "Avrebbe dovuto essere scritto come un commento o una risposta", quindi lo sto postando qui:

L' altro modo proposto non solo verificherà i rami ma qualsiasi riferimento con tale nome @jhuynh .

git rev-parse --verify <reference-name>
# $? == 0 means reference with <reference-name> exists.

Problema con un 'aggiornamento' sulla quiestion iniziale spiegato:

Supponiamo e controlliamo che 'master.000' sia solo un tag, tale ramo locale non esiste, grep restituisce una voce che è un tag. Rev-parse restituirà comunque 0 se il riferimento esiste, anche se tale ramo locale non esiste. Questa è una corrispondenza falsa, esattamente come menzionato da @ paul-s

$ git show-ref |grep master.000

f0686b8c16401be87e72f9466083d29295b86f4a refs/tags/master.000
$ git rev-parse --verify master.000
f0686b8c16401be87e72f9466083d29295b86f4a
$ echo $?
0



0

git show-refgit rev-parseopere sul mio caso.

$ git --version
git version 2.21.0

$ git show-branch --list
* [master] mybranch commit

$ BRANCH_NAME=mybranch
$ git rev-parse --verify $BRANCH_NAME
fatal: Needed a single revision

$ git show-ref refs/heads/$BRANCH_NAME
<no otput>
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch not exists

Ho finito con questo

$ BRANCH_NAME=mybranch
$ SHOW_ALL=`git show-branch --all | grep -w $BRANCH_NAME`
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch exists

Puoi farlo anche con un file di script

#!/bin/sh
BRANCH_NAME=mybranch
if grep -Fqe $BRANCH_NAME << EOF
`git show-branch --all`
EOF
then
   echo "$BRANCH_NAME exists"
else
   echo "$BRANCH_NAME not exists"
fi

-1

Se riesci a includere grep.

git branch | grep -q <branch>

1
Questo potrebbe darti la risposta sbagliata se usi i punti (".") Nei nomi dei rami, come faccio a volte, dato che il punto viene interpretato grepcome un metacarattere.
Peter John Acklam,

1
Otterrai anche un falso positivo se testerai un ramo il cui nome è una sottostringa di un ramo reale. eg abccorrisponderà se c'è un ramo chiamato abcdef.
rjmunro,

-1

Per l'uso in uno script, raccomando il seguente comando:

git ls-remote --heads <repo_url> "<branch_name>" | wc -l

Nota che <repo_url>può essere solo un "." per specificare il repository locale se ci si trova all'interno della sua struttura di directory, il percorso di un repository locale o l'indirizzo di un repository remoto.

Il comando restituisce uno 0 se <branch_name>non è presente 1 se presente.


-1
git branch --list $branch_name | grep $branch_name

quindi controlla che il valore restituito sia 0 o 1.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.