Eu preciso fazer uma mesclagem de subárvore para um ramo específico, se ele existir em um determinado repositório remoto. O problema é que o repositório remoto não foi retirado localmente, então não posso usar git branch -r
. Tudo o que tenho é um endereço remoto, algo assim https://github.com/project-name/project-name.git
. Existe uma maneira de listar ramos remotos apenas por um endereço remoto? Não consegui encontrar nada útil :(
105
git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/null
seguido porif [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi
/refs/heads/branch-name
. Caso contrário, o branchfoo/branch-name
seria retornado mesmo quando não houvessebranch-name
.git ls-remote --heads origin branch-name
fonte
git ls-remote --exit-code . origin/branch-name &> /dev/null
então usado$?
como operando de testeif git ls-remote ...; then ...; fi
, é menos sujeito a erros do que a verificação$?
(que pode ser alterada por declarações de registro, armadilhas, etc).--heads
?--heads
lista apenas ramos. use--tags
para listar apenas as tags.Outra maneira que você pode usar na pasta atual se for um repositório git para executar
fonte
git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
git branch -a | grep "\b${BRANCH}$"
git fetch
é necessário se usargit branch -a
para que todas as referências remotas sejam buscadas primeiro. Caso contrário, usegit ls-remote
conforme indicado por outros.git branch -a --list '<pattern>'
também é uma opção. Pipe para grep se precisar de um código de retorno para o seu script.Você também pode usar isto:
retorna o último commit e o valor de $? é 0, caso contrário, retorna "fatal: remotos de referência sha1 ruins / origin / <>" e valor de $? é 128
fonte
Então, não há necessidade de passar manualmente o nome do repositório todas as vezes.
Ao invés de
Exemplo:
OU
Ambos terão o mesmo resultado:
Mais sobre Origin : Git tem o conceito de "remotes", que são simplesmente URLs para outras cópias do seu repositório. Quando você clona outro repositório, o Git cria automaticamente um remoto chamado "origin" e aponta para ele. Você pode ver mais informações sobre o controle remoto digitando git remote show origin.
fonte
Todas as respostas aqui são específicas do shell do Linux, o que não ajuda muito se você estiver em um ambiente que não oferece suporte a esse tipo de operação - por exemplo, o prompt de comando do Windows.
Felizmente,
git ls-remote
aceita um--exit-code
argumento que retorna 0 ou 2, dependendo se a ramificação existe ou não, respectivamente. Assim:git ls-remote --exit-code --heads origin <branch-that-exists-in-origin>
retornará 0, e
git ls-remote --exit-code --heads origin <branch-that-only-exists-locally>
retornará 2.
Para PowerShell, você pode simplesmente usar a semântica de tratamento de veracidade integrada:
if (git ls-remote --heads origin <branch-that-exists-in-origin>) { $true } else { $false }
rende
$true
, enquanto:if (git ls-remote --heads origin <branch-that-only-exists-locally>) { $true } else { $false }
rendimentos
$false
.fonte
Você pode fazer algo assim no terminal Bash. Basta substituir os ecos pelos comandos que deseja executar.
Espero que ajude.
fonte
funciona na maioria das vezes.
Mas não funcionará se o ramo corresponder parcialmente como abaixo,
Usar
se você quiser uma maneira confiável.
Se você deseja usar no script e não deseja assumir
origin
como remoto padrão, entãoDeveria trabalhar.
Observe que
git branch -a | grep ...
não é confiável, pois pode demorar um pouco desde a últimafetch
execução.fonte
grep -x "$branch"
é idêntico agrep ^"$branch"$
). Embora em scripts eu prefiro a longo formulário muda:--line-regexp
. Além disso, não há necessidade de fazerwc -l
. Colocar uma saída vazia em um Bash éif [ -z ]
efetivamente avaliada como verdadeira, então significa que a ramificação não existe. Isso economiza alguns milissegundos.Você pode adicionar o repositório que possui como remoto usando
git remote add something https://github.com/project-name/project-name.git
e, em seguida, fazer umgit remote show something
para obter todas as informações sobre o remoto. Isso requer uma conexão de rede e é útil para uso humano.Como alternativa, faça a
git fetch something
. Isso irá buscar todos os branches da chamada remotasomething
e mantê-los em seu repositório local. Você pode então mesclá-los em sua filial local como desejar. Eu recomendo este caminho, pois se você finalmente decidir que precisa fazer a fusão, é isso que você precisa fazer.OT: O uso de "verificado localmente" indica que você está abordando isso de um ponto de vista de sistema de controle de versão centralizado. Isso geralmente é um beco sem saída quando você está lidando com o git. Ele usa palavras como "checkout", etc. diferentemente de como os sistemas mais antigos faziam.
fonte
Podes tentar
Aqui
@{u}
se refere a remote / upstream e@{0}
se refere ao HEAD local atual (com a versão mais recente do git,@{0}
pode ser abreviado como@
). Se remoto não existir, ocorrerá um erro.Com o git 2.16.2 (não tenho certeza de qual versão é a primeira a ter essa funcionalidade, por exemplo, git 1.7.1 não tem), você pode fazer
Se existir uma filial remota, haverá alguma saída, como
Caso contrário, não há saída.
fonte
Retornará todos os branches (remotos ou locais) que contêm a consulta no nome.
git branch --all | grep <query>
fonte
Se os nomes de seus ramos forem muito específicos, você pode não precisar usar grep para correspondência simples de nomes de ramos:
que funciona para
Usamos id de problema exclusivo como nomes de branch e funciona bem.
fonte
Eu só tentei isso:
Isso retornará 1 se o branch "seu-branch" for encontrado e 0 caso contrário.
fonte
Estou combinando algumas das respostas acima em um script:
Este script obterá 4 branches de um bitbucket remoto, e os enviará para um github remoto, e então enviará todas as tags para o github. Estou usando isso em um trabalho do Jenkins, é por isso que você não vê nenhum
git fetch
ougit pull
, isso já está feito na configuração do repositório de trabalhos do Jenkins.Normalmente prefiro opções de formato longo em scripts. Eu poderia ter combinado
git branch
egit checkout
usandogit checkout -B
.fonte