O rastreamento de uma única filial remota como uma filial local é bastante direto.
$ git checkout --track -b ${branch_name} origin/${branch_name}
Empurrar todas as ramificações locais para o controle remoto, criando novas ramificações remotas conforme necessário também é fácil.
$ git push --all origin
Eu quero fazer o contrário. Se eu tiver um número X de ramificações remotas em uma única fonte:
$ git branch -r
branch1
branch2
branch3
.
.
.
Posso criar ramificações de rastreamento local para todas essas ramificações remotas sem a necessidade de criar manualmente cada uma? Diga algo como:
$ git checkout --track -b --all origin
Eu pesquisei no Google e os RTMs, mas acabei ficando um bocado até agora.
git checkout --track origin/branchname
git pull origin
e apertetab
, para obter uma lista de ramificações remotas. Então continue digitando e pressionereturn
.Respostas:
Usando o bash:
depois do git 1.9.1 antes do git 1.9.1Atualize as ramificações, supondo que não haja alterações em suas ramificações de rastreamento local:
Ignore os avisos ambíguos de refname, o git parece preferir o ramo local como deveria.
fonte
git pull
possui uma--all
opção que buscará + mesclará todas as ramificações rastreadas.A resposta dada por Otto é boa, mas todos os ramos criados terão "origem /" como o início do nome. Se você deseja apenas que a última parte (após o último /) seja o seu nome de filial resultante, use este:
Ele também tem o benefício de não fornecer avisos sobre referências ambíguas.
fonte
grep -v master
, que talgrep -v /HEAD
? Este parece filtrar o ramo padrão, sem a necessidade de personalizaçãoA maioria das respostas aqui está complicando a análise da saída de
git branch -r
. Você pode usar o seguintefor
loop para criar as ramificações de rastreamento em todas as ramificações no controle remoto dessa maneira.Exemplo
Digamos que eu tenho esses ramos remotos.
Confirme se não estamos rastreando nada além de mestre, localmente:
Você pode usar esse liner para criar as ramificações de rastreamento:
Agora confirme:
Para excluí-los:
Se você usar a
-vv
opção,git branch
poderá confirmar:Repartição do loop for
O loop basicamente chama o comando
git branch -r
, filtrando qualquer ramo HEAD ou mestre na saída usandogrep -vE "HEAD|master"
. Para obter os nomes apenas dos ramos menos aorigin/
substring, usamos a manipulação de strings do Bash${var#stringtoremove}
. Isto irá remover a seqüência, "stringtoremove" da variável$var
. No nosso caso, estamos removendo a stringorigin/
da variável$i
.NOTA: Como alternativa, você também pode
git checkout --track ...
fazer isso:Mas eu particularmente não me importo com esse método, pois ele é alternado entre os ramos enquanto ele faz um checkout. Quando terminar, deixará você no último ramo que ele criou.
Referências
fonte
Atualização Q1 2020: Mohsen Abasi propõe nos comentários , com base em 2014 SLM 's resposta , a alternativa mais simples:
E usa em
$()
vez de reticulares obsoletos .Como mencionei em outra resposta antiga , o uso
git for-each-ref
é provavelmente mais rápido .E eu usaria o novo
git switch
comando (Git 2.23+) , que substitui o confusogit checkout
.Dessa forma, não é
grep
necessário.Old (2011) resposta original:
Aqui está o meu one-liner que eu uso (em um shell bash, testado com o msysgit1.7.4):
Para copiar e colar:
Para mais legibilidade:
remote
variável (pode ser 'origin
' ou qualquer nome que você tenha definido para um dos controles remotos do seu repositório atual do Git).origin/a/Branch/Name => a/Branch/Name
através daawk
expressãoele definirá a ramificação upstream através de
--set-upstream-to
(ou-u
) , não--track
:A vantagem é que, se a ramificação já existir, ela não falhará e não mudará a origem da ramificação, apenas definirá a
branch.xxx.(remote|merge)
configuração.Esse comando criará ramificações locais para todas as ramificações remotas do upstream e definirá suas configurações remota e de mesclagem para essa ramificação remota.
fonte
--set-upstream-to
vez de no--track
entanto.git switch
vez degit checkout
. Mas a sua (muito boa) idéia permanece.Você poderia escrever com bastante facilidade, mas não sei quando seria valioso. Esses ramos ficariam para trás rapidamente e você teria que atualizá-los o tempo todo.
As ramificações remotas serão automaticamente atualizadas, portanto, é mais fácil criar a ramificação local no ponto em que você realmente deseja trabalhar nela.
fonte
git up
atualiza todas as filiais locais.fonte
| grep -v HEAD
ao pipeline para que ele funcionasse corretamente.sem nenhum script (em um diretório vazio):
depois disso, todas as ramificações remotas serão vistas como locais.
original (em russo) .
fonte
Se você deseja usar o PowerShell e seu controle remoto é chamado de origem. Então isso funciona.
fonte
git svn clone'd
repositório:git branch -r | %{$_ -replace " origin/"} | %{git checkout -b $_ "origin/$_"}
git branch -r | %{$_ -replace " origin/"} | %{git branch -u "origin/$_" $_}
Use isso e você não terá um aviso como: refname 'origin / dev' é ambíguo
fonte
Aqui está minha solução do comando BASH referente a @tjmcewan:
Meu objetivo é resolver o problema de que todas as ramificações criadas terão "origem /" como o início do nome, porque testei que $ variáveis remotas ainda incluem "origem /":
fonte
Para fazer o mesmo que a resposta de tjmcewan, mas no Windows, chame isso de um arquivo em lotes :
Ou isso na linha de comando :
fonte
Do git 2.23 em diante:
O
-C
sinalizador paragit switch
cria ou redefine se ele já existe.documentação do switch git
fonte
Caso você já tenha algumas filiais registradas e queira
você pode usar o seguinte script compatível com bash e zsh:
fonte
Explicação:
linha 1: 'git branch -r' (seguido por 'git remote update' para atualizar as informações sobre alterações no remote) lista todas as ramificações remotas; 'egrep -vw' é usado para bater entradas com HEAD e mestre no resultado.
linha 3: acompanhe a ramificação remota nomeada enquanto a verifica localmente. Um awk simples é usado para evitar 'origin /' sendo o sufixo para ramificações locais.
fonte
Usando o bash, se você quiser fazer check-out de todos os ramos:
É importante observar que, quando você faz uma busca que desativa novas ramificações de rastreamento remoto, não possui automaticamente cópias editáveis locais.
fonte