Estou usando git-svn
para trabalhar no repositório central do Subversion da minha empresa. Recentemente, criamos uma nova ramificação de recursos no repositório central.
Como digo ao Git sobre isso? Quando corro git branch -r
, só consigo ver os ramos existentes quando corri fetch
contra o repositório Subversion para inicializar meu repositório Git?
Respostas:
Você pode adicionar manualmente a ramificação remota,
fonte
fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.
na etapa de checkout do git.Se você deseja rastrear TODAS as ramificações svn remotas, a solução é tão simples quanto:
Isso buscará TODAS as ramificações remotas que ainda não foram buscadas.
Dica extra: se você fez check-out apenas do tronco primeiro e depois deseja rastrear TODAS as ramificações, edite
.git/config
para ficar assim e execute novamentegit svn fetch
:Os pontos principais
url
devem apontar para a raiz do repositório e os caminhos definidos emfetch
ebranches
devem ser relativos aurl
.Se você deseja buscar apenas ramificações específicas em vez de ALL, há um bom exemplo em
git svn --help
:Nas versões mais antigas de
git-svn
, depois de especificar ramos como este, talvez você não consiga obter novos ramosgit svn fetch
. Uma solução alternativa é adicionar maisfetch
linhas, assim:Outra solução alternativa de @AndyEstes: edite
.git/svn/.metadata
e altere o valor debranches-maxRev
outags-maxRev
para uma revisão antes da criação de ramificações ou tags recém-especificadas. Depois de fazer isso, corragit svn fetch
para rastrear o novo ramo remoto svn.fonte
.git/svn/.metadata
foi muito útil! Eu estava adicionando ramificações extras no meu.git/config
, quegit svn fetch
não continuaram - porque o número da revisão de metadados estava "muito adiantado". Em um caso, apenas a última confirmação de uma ramificação foi buscada. Eu me livrei manualmente do ramo defeituoso (renomeado.git/svn/refs/remotes/svn/qa/XYZ
para.git/svn/refs/remotes/svn/qa/XYZ~
, deixei sua existência em.git/packed-refs
etc) ... escolhi um número de revisão "anterior" para os metadados ... corrigit svn fetch
para finalmente obter um histórico completo com o gráfico correto e conectado.git svn fetch --all
.Parece que eu só precisava
git svn fetch
; de alguma forma, eu tinha me convencido de que iria buscar o repositório inteiro em vez de apenas as alterações.fonte
Talvez eu tenha estragado tudo de alguma forma, mas segui as instruções da resposta de vjangus e quase funcionou. O único problema era que o galho novo não parecia ramificado do tronco. No gitk, era meio que "flutuante" por si só; não tinha ancestral comum com o tronco.
A solução para isso foi:
git diff-tree <sha1 from step 1> <sha1 from step 2>
- não deve haver saída. Se houver saída, você pode ter selecionado as confirmações incorretas.git checkout local-newbranch
entãogit rebase <sha1 from step 1>
. Isso será restauradolocal-newbranch
para a nova árvore, masremotes/newbranch
ainda será desconectado..git/refs/remotes/newbranch
e edite-o para conter o SHA1 completo do novo commit (no rebasednewbranch
) que corresponde ao commit antigo no qual ele está apontando. (Ou talvez usegit-update-ref refs/remotes/newbranch <new-SHA>
. Obrigado inger.)git svn dcommit
paranewbranch
, você vai ter um monte de mensagens sobre o assunto atualizando alguns log. Isso é normal, eu acho.Eu recomendo manter
gitk --all
aberto o tempo todo e atualizá-lo frequentemente para acompanhar o que você está fazendo. Ainda sou um pouco novo no git e no git svn, por isso sugira melhorias nesse método.fonte
Uma simplificação da resposta de vjangus:
Se você estiver usando o layout padrão no SVN e tiver feito o svn init usual, o git-svn fará as coisas de configuração para você. Somente:
Um exemplo. URL do SVN é
svn+ssh://[email protected]/repo
. O ramo SVN que estou procurando énewbranch
. A ramificação git local (rastreamento remotonewbranch
) serágit-newbranch
.Etapa 1: encontre a revisão da cópia da filial
Portanto, o ponto de ramificação no SVN é a revisão 7802.
Etapa 2: buscar a revisão
O git-svn fez todo o trabalho e agora sabe sobre o controle remoto:
Etapa 3: Crie sua nova filial local rastreando a remota:
fonte
show-ref
é inestimável)! Para qualquer pessoa com referências erradas às ramificações remotas, você pode excluí-las (eu tive que fazergit branch -d newbranch
e depois forçar a remoção do diretório ref.git/svn/refs/remotes/newbranch
) e, em seguida, começar novamente na etapa 2 (acima).Não encontrei nenhuma documentação sobre esse recurso, mas parece que a configuração do git svn suporta várias entradas de busca. Dessa forma, você também pode adicionar ramificações separadamente, sem precisar adicionar outra entrada remota do repositório svn à sua configuração nem usar caracteres curinga para obter todas as ramificações de determinado diretório.
Suponha que sua árvore SVN seja realmente desagradável, tendo muitas ramificações sem nenhuma lógica de como elas estão localizadas, por exemplo, tendo ramificações e subdiretórios contendo mais ramificações.
ie
e você só quer escolher alguns dos ramos a serem incluídos no seu repositório git.
Você pode primeiro iniciar seu repositório apenas com o tronco sem ramificações adicionais:
Depois disso, você deverá ver a seguinte configuração:
sempre que quiser buscar uma nova ramificação do MyRepo, você pode adicionar novas entradas de busca à configuração:
Ou você pode editar a mesma configuração em .git / config
Para buscar os novos ramos após adicioná-los à configuração, basta executar:
[Editar] Às vezes parece ser necessário executar a busca com o parâmetro --all para buscar ramificações adicionadas recentemente:
fonte
Em vez de lidar com as peculiaridades do git-svn, você pode tentar o SubGit .
É preciso instalar o SubGit no repositório do Subversion. Depois disso, é possível usar o fluxo de trabalho padrão do git em vez de usar os comandos especiais git-svn:
Enviando novos commits:
git-svn:
SubGit:
Buscando alterações recebidas
git-svn:
SubGit:
Criando uma nova ramificação:
git-svn:
SubGit:
Veja a documentação do SubGit para mais detalhes.
fonte
Para adicionar à resposta de vjangus, o que me ajudou, também achei útil adicionar enxertos de uso git para amarrar os galhos ao tronco no ponto apropriado - permitindo que o git veja o histórico e faça as mesclagens corretamente.
Este é simplesmente o caso de adicionar uma linha aos
.git/info/grafts
hashes:por exemplo.
Crédito para http://evan-tech.livejournal.com/255341.html
(Eu adicionaria isso como um comentário, mas não tenho reputação suficiente.)
fonte
Se você não fizer o check-out com um layout válido, não poderá fazer check-out de uma filial remota.
Isto é o que eu faço:
Depois disso, você pode mudar para uma ramificação remota:
Então você será automaticamente trocado para sua filial.
fonte