Ao programar o software armazenado em um repositório do Subversion, geralmente modifico alguns arquivos, depois percebo que gostaria de fazer algumas alterações preparatórias para o meu trabalho principal. Por exemplo, ao implementar novas funcionalidades, noto alguma refatoração que pode me ajudar.
Para não misturar duas alterações não relacionadas, nesses casos, eu gostaria de "ocultar" minhas alterações, ou seja, reverter para a versão do repositório, fazer outras alterações, confirmar essas alterações e "recuperar" minhas alterações.
O git-stash permite fazer exatamente isso. Existe alguma maneira de fazer isso com o Subversion, diretamente ou com algum plugin ou script. Os plugins do Eclipse também ficariam bem.
svn
versioning
sleske
fonte
fonte
Respostas:
Quando tenho alterações não confirmadas de uma tarefa na minha cópia de trabalho e preciso mudar para outra tarefa, faço uma de duas coisas:
Confira uma nova cópia de trabalho para a segunda tarefa.
ou
Inicie uma filial:
Eu tenho alguns scripts que ajudam a automatizar isso.
fonte
project\temp\<creationdate-reason>
ouproject\personal\<creationdate-reason>
para esse fim.Esta postagem do blog aconselha o uso de diff e patch.
git stash
torna-se aproximadamentesvn diff > patch_name.patch; svn revert -R .
git stash apply
torna-sepatch -p0 < patch_name.patch
Observe que isso não esconde alterações de metadados ou (eu acho) o diretório cria / exclui. (Sim, o svn rastreia aqueles separadamente do conteúdo do diretório, ao contrário do git.)
fonte
svn patch patch_name.patch
vez depatch -p0
, porque eles estão no arquivo de correção, e o svn patch os entende.Você pode armazenar suas alterações atuais
svn diff
em um arquivo de correção e reverter sua cópia de trabalho:Depois de implementar seu recurso preparatório, você poderá aplicar seu patch com o utilitário de patch:
Como outros observaram, isso não funcionará com
svn:properties
operações em árvore (adicione, remova, renomeie arquivos e diretórios).Arquivos binários também podem causar problemas, não sei como o patch (ou o TortoiseSVN, neste caso, os trata).
fonte
$ patch --strip=0 < stash.patch
Isso garantirá que o patch não pergunte o nome do arquivo quando você estiver aplicando o patch.A maneira mais fácil seria usar uma ramificação temporária, assim:
Isso poderia (e provavelmente deveria) ser colocado em um script se feito com mais regularidade.
fonte
A partir de 1.10.0 (13-04-2018), você tem um
svn shelve
comando experimental . (O TortoiseSVN suporta o comando ) Não é senão um auxiliar salvar um patch e aplicar novamente, por isso possui as mesmas limitações dosvn diff
+patch
(ou seja, não pode lidar com arquivos binários e renomear). ( Edit : Parece que o suporte binário está chegando na próxima versão 1.11.0 )Editar ^ 2: com 1.11.0 (lançado em 30-10-2018), os arquivos binários são suportados . Arquivar arquivos renomeados permaneceu sem suporte. As prateleiras no 1.11 são incompatíveis com as prateleiras criadas pelo 1.10.
Editar ^ 3: com 1.12.0 (lançado em 24/04/2019), a cópia e a renomeação são suportadas . As prateleiras na versão 1.12 são incompatíveis com as prateleiras criadas por versões anteriores.
Editar ^ 4: Não há alterações em relação às prateleiras com 1.13.0 e 1.14.0 . Os comandos ainda estão marcados como experimentais e você precisa definir
SVN_EXPERIMENTAL_COMMANDS=shelf3
para ativar o recurso. Parece que o recurso não tem triagem no momento .As notas de design podem ser encontradas no Wiki dos desenvolvedores .
fonte
Eu não sei de uma maneira fácil de fazer isso com apenas svn. Honestamente, eu aconselho usar
git-svn
para criar um repositório git que funcione como uma cópia de trabalho svn, e apenas uságit stash
-lo. Basta substituirgit pull
porgit svn rebase
egit push
comgit svn dcommit
e você poderá manter 90% do seu fluxo de trabalho git e ainda estar conversando com um servidor svn.fonte
Há um pequeno script Python 2 chamado
svn-stash
disponível na GPL 3: https://github.com/frankcortes/svn-stash .Funciona como as
svn diff/patch
soluções mencionadas e oferece o envio e a liberação de alterações conforme as diferenças em algum diretório local. Infelizmente, os stashes não podem ser nomeados e apenas o último pode ser exibido (bem, sim, é uma pilha, mas não há motivo real para essa limitação.) Mas, então, você sempre pode criar os recursos ausentes no fonte.Ele foi escrito para * ix, mas depois de substituir todos os "/" por
os.sep
ele também funciona bem no Windows.Se você usa o svn 1.7 ou superior, é necessário alterar
is_a_current_stash()
: remova a linhaif ".svn" in os.listdir(CURRENT_DIR):
, pois existe apenas um subdiretório .svn de nível superior nos 1.7 WCs.fonte
Você pode fazer isso facilmente usando o Intellij IDEA - Shelve Changes
fonte
metadata changes
edirectory creates/deletes
? Como exatamente o quegit stash
faz?outra opção é copiar seu checkout atual para um novo diretório e reverter todas as suas alterações. Dessa maneira, você evitará o incômodo de criar uma ramificação temporária no servidor - afinal, o armazenamento em cache é uma operação local, que nem todo mundo deve ver e pode ser feito com bastante frequência.
depois de confirmar seu hotfix, você pode atualizar sua cópia principal de trabalho e excluir sua "área de armazenamento"
fonte
Eu também queria esse recurso. Atualmente, uso o TortoiseSVN.
Eu não encontrei uma solução mais rígida, exceto para exportar a árvore, reverter novamente para o repositório, fazer minhas alterações e confirmar e comparar as alterações da árvore exportada para o meu diretório controlado de origem usando uma ferramenta como Beyond Compare.
Ou, outra solução pode ser ramificar do HEAD para outro diretório, fazer suas alterações e confirmar. Quando estiver pronto para mesclar esses itens à sua outra cópia de trabalho, faça uma atualização e mescle suas alterações.
fonte
Eu sempre mantenho um segundo checkout, que chamo de "trunk_clean". Sempre que eu preciso fazer uma alteração rápida e isolada relacionada ao que estou fazendo, eu apenas faço o checkout.
fonte
As idéias de ramificação e correção acima são ótimas, mas elas não funcionam bem para mim. Eu uso uma ferramenta visual diff, portanto, a execução
git diff
não produz patches baseados em texto. Nosso sistema de criação cria um novo ambiente toda vez que uma ramificação é criada, portanto, a criação de ramificações temporárias "stash" seria uma bagunça.Em vez disso, escrevi um pequeno script de shell que copia um arquivo para um diretório "shelf", adiciona um carimbo de data e hora e reverte a alteração. Não é tão robusto quanto as soluções acima, mas também evita algumas das armadilhas que encontrei.
fonte
Com base na resposta de Walter, criei os seguintes aliases no meu arquivo bashrc:
Esses aliases são muito mais fáceis de usar e lembrar.
Uso:
svn.stash para esconder alterações e svn.stash.apply para aplicar stash.
fonte
Na minha prática, eu uso
git init
para criar um repositório Git notrunk
diretório do meu repositório Subversion, e depois adiciono*.git
aos padrões de ignição do Suctions.Após modificar alguns arquivos, se eu quiser continuar meu trabalho com a linha principal do Subversion, apenas o uso
git stash
para esconder meu trabalho. Após me comprometer com o repositório Subversion, eu usogit stash pop
para restaurar minhas modificações.fonte
Usar:
Ele criará uma ramificação a partir do local atual e da revisão atual e, em seguida, confirmará as alterações na cópia de trabalho para essa ramificação sem mudar para ela.
Observe que as alterações na cópia de trabalho não serão revertidas automaticamente (
cp
apenas copiando as alterações para uma nova ramificação) e você precisará revertê-las manualmente.Para restaurar as alterações, basta mesclar as alterações da ramificação recém-criada à sua cópia de trabalho.
--ignore-ancestry
é usado para não atualizar as informações de mesclagem na cópia de trabalho.Usar:
para ver o que você tem no caminho do esconderijo. Revisões confirmadas também são impressas.
Se você não precisar mais do stash, basta executar:
Essa solução é melhor do que usar o patch, pois se novas alterações na cópia de trabalho ou na ramificação atual entrarem em conflito com as alterações no stash, você poderá resolver os conflitos usando o svn significa, enquanto
patch
em alguns casos apenas falhará ou até aplicará o patch incorretamente.fonte
Como o Subversion não suporta
stash
recursos perfeitamente,eu apenas faço da maneira manual assim.
Coloque
Development
eProduction(release)
projete em um caminho separado.Você pode trabalhar com todos os novos recursos do seu projeto no caminho de desenvolvimento
e só comprometeria um progresso significativo ou algo deveria ser liberado para o estábulo.
Quando você tiver que liberá-lo para produção, abra o projeto de produção, atualize o svn e faça coisas para liberar (compilar, exportar ... etc).
Sei que isso torna um pouco problemático, mas liberar progresso não acontece com frequência (não acontece para mim, mas eu sei que alguns projetos) se comparam para desenvolver progresso, dessa forma se encaixa para mim.
Estou usando o svn para projetos específicos, já que os membros da equipe do projeto o usam, então tenho que segui-lo.
A melhor solução é usar
git
um sistema de controle de versão perfeito e melhor quesvn
.fonte
dev
eprod
, 2 situações. Desenvolver funcionalidades completamente novas seria complicado com o svn. Não tenho certeza se existe um método claro para resolver seu caso no svn world.