Eu tenho algumas ramificações antigas no meu repositório git que não estão mais em desenvolvimento ativo. Gostaria de arquivar os ramos para que eles não apareçam por padrão durante a execução git branch -l -r
. Não quero excluí-los, porque quero manter o histórico. Como posso fazer isso?
Eu sei que é possível criar uma referência fora de refs / heads. Por exemplo refs/archive/old_branch
,. Há alguma conseqüência disso?
git checkout [rev] file
Attic/<branchname>
tags leves para arquivar ramos, no entanto.Respostas:
Acredito que a maneira correta de fazer isso é marcar o ramo. Se você excluir o ramo depois de marcá-lo, manterá o ramo efetivamente por perto, mas isso não irá desorganizar sua lista de ramos.
Se você precisar voltar para o ramo, verifique a tag. Ele efetivamente restaurará a ramificação da tag.
Para arquivar e excluir a ramificação:
Para restaurar a ramificação algum tempo depois:
O histórico do ramo será preservado exatamente como estava quando você o marcou.
fonte
git checkout -b <branchname> archive/<branchname>
branch -D
pois provavelmente não será totalmente mesclado, se o estiver arquivando dessa maneiraA resposta de Jeremy está correta em princípio, mas IMHO os comandos que ele especifica não estão certos.
Veja como arquivar um ramo em uma tag sem precisar fazer check-out do ramo (e, portanto, sem ter que fazer check-out para outro ramo antes de poder excluir esse ramo):
E aqui está como restaurar um ramo:
fonte
Sim, você pode criar uma ref com algum prefixo não padrão usando
git update-ref
. por exemplogit update-ref refs/archive/old-topic topic && git branch -D topic
git branch topic refs/archive/old-topic
Referências com prefixo não padrão (aqui
refs/archive
) não aparecerão normalmentegit branch
,git log
nemgit tag
. Ainda assim, você pode listá-los comgit for-each-ref
.Estou usando os seguintes aliases:
Além disso, convém configurar os controles remotos, como
push = +refs/archive/*:refs/archive/*
empurrar ramificações arquivadas automaticamente (ougit push origin refs/archive/*:refs/archive/*
de uma só vez).Outra maneira é escrever o SHA1 em algum lugar antes de excluir o ramo, mas ele tem limitações. As confirmações sem qualquer referência serão submetidas ao GC após 3 meses (ou algumas semanas sem reflog) , e muito menos manual
git gc --prune
. As confirmações apontadas pelos árbitros estão a salvo do GC.Edit: Encontrou uma implementação perl da mesma ideia por @ap :
git-attic
Editar ^ 2: Encontrou um post no qual o próprio Gitster usava a mesma técnica.
fonte
Estendendo a resposta de Steve para refletir as mudanças no controle remoto, eu fiz
Para restaurar a partir do controle remoto, consulte esta pergunta .
fonte
Você pode arquivar as ramificações em outro repositório. Não é tão elegante, mas eu diria que é uma alternativa viável.
fonte
git-bundle
vez de repositório separado.Aqui está um alias para isso:
Adicione assim:
Lembre-se de que
git archive
já existe um comando, portanto você não pode usá-loarchive
como um nome alternativo.Também é possível definir alias para visualizar a lista dos ramos 'arquivados':
sobre como adicionar aliases
fonte
!git tag archive/$1 $1 && git branch -D
Estou usando os seguintes aliases para ocultar ramificações arquivadas:
Então,
git br
para mostrar ramificações ativamente desenvolvidas egit bra
mostrar todas as ramificações, incluindo as "arquivadas" .fonte
Eu não arquivaria ramos. Dito de outra maneira, os ramos se arquivam. O que você deseja é garantir que as informações relevantes para os arqueólogos possam ser encontradas por meios confiáveis. Confiáveis, pois ajudam no desenvolvimento diário e não adicionam uma etapa extra ao processo de realização do trabalho. Ou seja, não acredito que as pessoas se lembrem de adicionar uma tag depois de concluir uma ramificação.
Aqui estão duas etapas simples que ajudarão muito a arqueologia e o desenvolvimento.
git merge --no-ff
para mesclar ramificações de tarefas; você deseja que a consolidação de mesclagem e a bolha do histórico, mesmo para apenas uma consolidação.É isso aí. Por quê? Porque como arqueólogo de código, raramente começo a querer saber o que foi feito em uma ramificação. Muito mais frequentemente
, é por que em todos os nove infernos que gritamos o código está escrito dessa maneira ?!Preciso alterar o código, mas ele tem alguns recursos estranhos e preciso decifrá-los para evitar que algo importante seja quebrado.O próximo passo é
git blame
encontrar as confirmações associadas e esperar que a mensagem de log seja explicativa. Se eu precisar aprofundar, vou descobrir se o trabalho foi feito em uma ramificação e ler a ramificação como um todo (junto com seus comentários no rastreador de problemas).Digamos
git blame
pontos em confirmar XYZ. Eu abro um navegador de histórico do Git (gitk, GitXgit log --decorate --graph
, etc ...), localizo commit XYZ e vejo ...Aqui está o meu ramo! Sei que QQ, UU, XYZ, JJ e MM fazem parte da mesma ramificação e devo ver suas mensagens de log para obter detalhes. Eu sei que o GG será um commit de mesclagem e tem o nome da ramificação que, espero, está associada a um problema no rastreador.
Se, por algum motivo, desejar encontrar um ramo antigo, eu possa executar
git log
e procurar o nome do ramo no commit de mesclagem. É rápido o suficiente, mesmo em repositórios muito grandes.É isso que quero dizer quando digo que os próprios arquivos se ramificam.
Marcar cada ramificação adiciona trabalho desnecessário à realização de tarefas (um processo crítico que deve ser simplificado de forma implacável), organiza a lista de tags (sem falar em desempenho, mas legibilidade humana) com centenas de tags que são apenas ocasionalmente úteis e não é ' mesmo muito útil para arqueologia.
fonte
Minha abordagem é renomear todos os ramos com os quais não me importo com o prefixo "lixeira_" e, em seguida, use:
(com uma ligação de chave shell)
Para manter a coloração do ramo ativo, seria necessário:
fonte
Você pode usar um script que arquivará a ramificação para você
archbranch
Ele cria uma tag para você com o prefixo archive / e exclui a ramificação. Mas verifique o código antes de usá-lo.
Uso -
$/your/location/of/script/archbranch [branchname] [defaultbranch]
Se você deseja executar o script sem escrever o local, adicione-o ao seu caminho
Então você pode chamá-lo
O
[defaultbranch]
é o ramo para o qual ele irá quando o arquivamento for concluído. Existem alguns problemas com o código de cores, mas outros ainda devem funcionar. Uso-o em projetos há muito tempo, mas ele ainda está em desenvolvimento.fonte
Às vezes, eu arquivo ramificações da seguinte maneira:
format-patch <branchName> <firstHash>^..<lastHash>
(get firstHash e lastHash usandogit log <branchName>
.git branch -D <branchName>
"Aplique" o patch quando precisar usar o ramo novamente; no entanto, a aplicação dos arquivos de correção (consulte
git am
) pode ser um desafio, dependendo do estado da ramificação de destino. No lado positivo, essa abordagem tem o benefício de permitir que os commits da filial sejam coletados de lixo e economizando espaço em seu repositório.fonte