Eu clonei um repositório Git, que contém cerca de cinco ramos. No entanto, quando eu git branch
vejo apenas um deles:
$ git branch
* master
Sei que posso fazer git branch -a
para ver todos os galhos, mas como eu puxaria todos os galhos localmente; assim, quando o faço git branch
, mostra o seguinte?
$ git branch
* master
* staging
* etc...
git
branch
git-branch
David542
fonte
fonte
--single-branch
ajuste quando a clonagem: stackoverflow.com/questions/17714159/... (git fetch --all
nunca vai funcionar se você tiver especificado apenas um ramo!)git clone --bare <repo url> .git
(observe que você precisa adicionar "--bare" e ".git" no final para clonar o repositório como um repo "bare"), thengit config --bool core.bare false
(define o sinalizador "bare" como false), thengit reset --hard
(move o HEAD para o HEAD atual no repo). Agora, se vocêgit branch
ver todos os ramos do repositório clonado.Respostas:
Você pode buscar todas as ramificações de todos os controles remotos como este:
É basicamente uma jogada de poder .
fetch
atualiza cópias locais de filiais remotas para que seja sempre seguro para suas filiais locais, MAS :fetch
não atualizará ramificações locais (que rastreiam ramificações remotas); se você quiser atualizar suas ramificações locais, ainda precisará extrair todas as ramificações.fetch
não criará ramificações locais (que rastreiam ramificações remotas), você deve fazer isso manualmente. Se você deseja listar todas as ramificações remotas:git branch -a
Para atualizar ramificações locais que rastreiam ramificações remotas:
No entanto, isso ainda pode ser insuficiente. Ele funcionará apenas para suas filiais locais que rastreiam filiais remotas. Para rastrear todas as ramificações remotas, execute este oneliner ANTES
git pull --all
:Versão TL; DR
(Parece que o pull busca todos os ramos de todos os controles remotos, mas eu sempre busco primeiro apenas para ter certeza.)
Execute o primeiro comando apenas se houver ramificações remotas no servidor que não sejam rastreadas por suas ramificações locais.
PS AFAIK
git fetch --all
egit remote update
são equivalentes.O comentário de Kamil Szot , que as pessoas acharam úteis.
fonte
git checkout -b localname remotename/remotebranch
for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done
porque seu código criado filiais locais nomeados origem / branchname e eu estava ficando "refname 'origin / branchname' é ambígua sempre que se refere a ele.git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done
. A mudança retira HEAD.for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Para listar ramificações remotas:
git branch -r
Você pode vê-los como filiais locais com:
git checkout -b LocalName origin/remotebranchname
fonte
git checkout remotebranchname
e funciona. qual a diferença com a sua solução?git checkout remotebranchname
usado para criar apenas uma nova ramificação não relacionada denominada remotebranchname .Você precisará criar filiais locais que rastreiam filiais remotas.
Supondo que você tenha apenas um controle remoto chamado
origin
, esse snippet criará ramificações locais para todas as de rastreamento remoto:Depois disso,
git fetch --all
atualizará todas as cópias locais das ramificações remotas.Além disso,
git pull --all
atualizará suas ramificações de rastreamento local, mas, dependendo das confirmações locais e de como a opção de configuração 'mesclar' estiver definida, isso poderá criar uma confirmação de mesclagem, avanço rápido ou falha.fonte
git pull --all
atualizará todas as ramificações de rastreamento local? Tanto quanto posso dizer, apenas atualiza o ramo atual de todos os controles remotos.origin
? Veja esta resposta que funcionará em todos os nomes remotos.Se você fizer:
então eles estarão todos lá localmente. Se você executar:
você os verá listados como controles remotos / origem / nome da filial. Uma vez que eles estão lá localmente, você pode fazer o que quiser com eles. Por exemplo:
ou
ou
fonte
--all
)git fetch -all
busca todos os ramos de todos os controles remotos.git fetch origin
busca todos os ramos do controle remotoorigin
. Quanto mais tarde é o que o OP estava perguntando.--all
significa "todos os controles remotos", não "todos os ramos de um determinado controle remoto". O último está implícito em qualquer busca de um controle remoto.Isso pressupõe que todas as ramificações são rastreadas.
Se não estiverem, você pode disparar isso no Bash:
Em seguida, execute o comando
fonte
->
o que provavelmente vai existir na saídagit branch -r
como `origem / HEAD -> origem / master`Branch 'origin/quote-filenames' set up to track local branch 'master'.
A saída desejada é:Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'.
Isso é inverso , definindo a origem para rastrear o controle remoto. Veja esta resposta para uma correção.git fetch
não funcionaria. Portanto, a lição aqui é que você precisa acompanhar as ramificações remotas. Gracias!O
for
loop Bash não estava funcionando para mim, mas isso fez exatamente o que eu queria. Todos os ramos da minha origem espelhavam o mesmo nome localmente.Veja o comentário de Mike DuPont abaixo. Acho que estava tentando fazer isso em um servidor Jenkins, que o deixa no modo de cabeça desanexada.
fonte
fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
depois de um simples clone. Tem que destacar a cabeça primeiro. Eu fiz isso comgit checkout <SHA>
git checkout --detach # detach the head
e depoisgit fetch origin \'+refs/heads/*:refs/heads/*
Use
git fetch && git checkout RemoteBranchName
.Funciona muito bem para mim...
fonte
origin/branch
; basta dizer apenasbranch
).Quando você clona um repositório, todas as informações dos ramos são realmente baixadas, mas os ramos ficam ocultos. Com o comando
você pode mostrar todas as ramificações do repositório e com o comando
você pode "baixá-los" manualmente, um de cada vez.
No entanto, existe uma maneira muito mais limpa e rápida, embora seja um pouco complicado. Você precisa de três etapas para fazer isso:
Primeiro passo
crie uma nova pasta vazia na sua máquina e clone uma cópia espelhada da pasta .git do repositório:
o repositório local dentro da pasta my_repo_folder ainda está vazio, existe apenas uma pasta .git oculta agora que você pode ver com um comando "ls -alt" no terminal.
Segundo passo
alterne este repositório de um repositório vazio (vazio) para um repositório regular alternando o valor booleano "bare" das configurações do git para false:
Terceiro passo
Pegue tudo o que está dentro da pasta atual e crie todas as ramificações na máquina local, tornando isso um repositório normal.
Então agora você pode apenas digitar o comando
git branch
e pode ver que todos os ramos foram baixados.Essa é a maneira rápida em que você pode clonar um repositório git com todos os ramos de uma só vez, mas não é algo que você deseja fazer para cada projeto dessa maneira.
fonte
Você pode buscar todos os ramos por:
ou:
O
--depth=10000
parâmetro pode ajudar se você tiver um repositório raso.Para puxar todos os galhos, use:
Se o acima não funcionar, preceda o comando acima com:
pois ele
remote.origin.fetch
pode suportar apenas um ramo específico durante a busca, especialmente quando você clonou seu repositório--single-branch
. Verifique isso:git config remote.origin.fetch
.Depois disso, você poderá fazer checkout de qualquer agência.
Veja também:
Para enviar todas as ramificações para o controle remoto, use:
eventualmente
--mirror
para espelhar todos os árbitros.Se seu objetivo é duplicar um repositório, consulte: Duplicando um artigo de repositório no GitHub.
fonte
depth=1
) e a configuração também especificou um ramo específico parafetch
- odepth=1000
parâmetro foi a correção que me ajudou a verificar um ramo remoto específicopull --all
não puxa todos os ramos, mas todos os controles remotosEu costumo usar nada além de comandos como este:
Uma versão um pouco mais curta:
fonte
Acredito que você clonou o repositório por:
Agora vá para essa pasta usando o cd:
Se você digitar,
git status
poderá ver tudo:Para ver todos os tipos de ramificação ocultos:
Ele listará todas as ramificações remotas.
Agora, se você quiser fazer o checkout em qualquer filial em particular, digite:
fonte
Se você está aqui procurando uma solução para obter todas as filiais e depois migrar tudo para outro servidor Git, montei o processo abaixo. Se você deseja atualizar todos os ramos localmente, pare na primeira linha vazia.
fonte
git fetch git pull
stackoverflow.com/a/292359/1114926pull
realmente faz ofetch
primeiro, mas é mais fácil saber se o problema é dafetch
partepull
ou damerge
parte subsequente depull
quandofetch
é executado independentemente.Depois de clonar o repositório principal, você pode executar
fonte
Verifique se todas as ramificações remotas são buscáveis
.git/config
arquivo.Neste exemplo, apenas a
origin/production
ramificação é buscável, mesmo se você tentar fazergit fetch --all
nada acontecerá, além de buscar aproduction
ramificação:Esta linha deve ser substituída por:
Então execute
git fetch
etc ...fonte
git config --get remote.origin.fetch
e depois defini-lo (destrutivamente):git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
Looping não parecia funcionar para mim e eu queria ignorar a origem / mestre. Aqui está o que funcionou para mim.
Depois disso:
fonte
grep | awk
antipadrão :git branch -r | awk -F 'origin/' '!/HEAD|master/{
...Apenas estes três comandos obterão todos os ramos:
fonte
pull --all
. Mas se ainda for necessário, a outra resposta abaixo, de @Johnno Nola, assumindo que todos os ramos sejam rastreados, misturados a essa resposta, é o caminho a seguir.Por que ninguém responde à pergunta dos caras e explica o que está acontecendo?
Acompanhe todas as ramificações remotas:
Rastreie todas as ramificações existentes no repositório remoto.
Faça manualmente:
Você substituiria
<branch>
por uma ramificação exibida na saída degit branch -r
.Faça isso com um script bash
Atualize as informações sobre as ramificações remotas no seu computador local:
Isso busca atualizações nas ramificações do repositório remoto que você está rastreando no repositório local. Isso não altera suas filiais locais. Seu repositório git local agora está ciente das coisas que aconteceram nas ramificações remotas. Um exemplo seria que uma nova confirmação foi enviada ao mestre remoto, ao fazer uma busca agora o alertará de que seu mestre local está atrasado em 1 confirmação.
Atualize as informações sobre as ramificações remotas no computador local e atualize as ramificações locais:
Faz uma busca seguida por uma mesclagem para todas as ramificações do controle remoto para a ramificação local. Um exemplo seria que uma nova confirmação foi enviada ao mestre remoto, fazendo uma solicitação atualizará seu repositório local sobre as alterações na ramificação remota e, em seguida, mesclará essas alterações na ramificação local. Isso pode criar uma bagunça devido a conflitos de mesclagem.
fonte
Escrevi um pequeno script para gerenciar a clonagem de um novo repositório e criar ramificações locais para todas as ramificações remotas.
Você pode encontrar a versão mais recente aqui :
Para usá-lo, basta copiá-lo para o diretório git bin (para mim
C:\Program Files (x86)\Git\bin\git-cloneall
) e, em seguida, na linha de comando:Ele clona como de costume, mas cria ramificações de rastreamento local para todas as ramificações remotas.
fonte
Como buscar todas as ramificações do Git que seguem o controle remoto único.
Isso foi testado e funciona no Red Hat e no Git Bash no Windows 10.
TLDR:
Explicação:
O liner único faz check-out e busca todos os ramos, exceto HEAD.
Listar as ramificações de rastreamento remoto.
Ignore HEAD.
Retire o nome da filial do (s) controle (s) remoto (s).
Faça o check-out de todas as filiais que acompanham um único controle remoto.
Buscar ramificação com check-out.
Tecnicamente, a busca não é necessária para novas ramificações locais.
Isto pode ser utilizado para qualquer
fetch
oupull
ramos que são novos e têm mudanças em remotas (s).Apenas certifique-se de puxar apenas se estiver pronto para mesclar.
Configuração de teste
Confira um repositório com URL SSH.
Antes
Verifique as agências no local.
Executar comandos
Execute o liner único.
Depois de
Verifique se as ramificações locais incluem ramificações remotas.
fonte
Para usuários do Windows que usam o PowerShell:
fonte
git branch -r | ForEach-Object { # Skip default branch, this script assumes # you already checked-out that branch when cloned the repo if (-not ($_ -match " -> ")) { $localBranch = ($_ -replace "^.*?/", "") $remoteBranch = $_.Trim() git branch --track "$localBranch" "$remoteBranch" } }
Aqui está algo que eu consideraria robusto:
HEAD
para acompanharorigin/HEAD
origin
Não é necessário,
git fetch --all
como passar-all
paragit pull
passar essa opção para o internofetch
.Crédito para esta resposta .
fonte
Aqui está uma versão Perl do one-liner fornecida na resposta aceita:
git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file
Você pode executar o arquivo de saída como um script do Shell, se desejar.
Excluímos nosso repositório de projetos Stash por acidente. Felizmente, alguém havia criado um garfo antes da perda acidental. Eu clonei o garfo no meu local (omitir os detalhes de como eu fiz isso). Depois de colocar o garfo totalmente no meu local, executei uma linha. Modifiquei a URL do controle remoto (origem no meu caso) para apontar para o repositório de destino para o qual estávamos recuperando:
git remote set-url origin <remote-url>
E finalmente empurrou todos os ramos para a origem da seguinte maneira:
git push --all origin
e estávamos de volta aos negócios.
fonte
Podemos colocar todos os nomes de ramificações ou tags em um arquivo temporário e, em seguida, git pull para cada nome / tag:
fonte
Se você tiver problemas
fetch --all
, acompanhe sua ramificação remota:fonte
Para evitar a mensagem de erro 'fatal: já existe uma ramificação chamada' origin / master '.', É necessário:
fonte
Com base na resposta de Learath2, aqui está o que eu fiz depois de fazer
git clone [...]
ecd
inserir o diretório criado:git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b
Trabalhou para mim, mas não sei se funcionará para você. Seja cuidadoso.
fonte
Agora localmente, você
yourNewLocalBranchName
é seurequiredRemoteBranch
.fonte
Para usuários do Visual Studio, no console do Gerenciador de Pacotes:
ramo git | % {git buscar a montante; git mesclar upstream / master}
fonte
Já tentei de várias maneiras, apenas esta é simples e funciona para mim.
fonte
Definir alias: (com base na resposta superior)
Agora, para acompanhar todos os ramos:
git track-all-branches
fonte