Como faço para voltar a uma versão mais antiga do nosso código no Subversion?

StackOverflow https://stackoverflow.com/questions/814433

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu estou trabalhando em um projeto com um amigo e quero voltar para uma versão mais antiga do nosso código e configurá-lo para ser o atual. Como posso fazê-lo?

Eu estou usando "anksvn" na VS08.

Eu tenho a versão que eu quero no meu PC, mas o cometer está falhando; A mensagem que eu recebo é "Commit é falhou, arquivo ou diretório está desatualizado."

Eu também tenho o cliente subversion no meu PC.

Foi útil?

Solução

Basicamente, você precisa "para trás Merge" - aplicar um diff entre a versão atual e anterior para a versão atual (assim você acaba com uma cópia de trabalho parecendo a versão antiga) e, em seguida, cometer novamente. Assim, por exemplo, para ir de revisão 150 (atual) de volta para revisão 140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

O Livro Subversion Red tem um boa seção sobre este .

Outras dicas

Você só pode cometer novas alterações no cabeça da história subversão.

A razão que você não pode fazer nada diretamente com a boa cópia que você tem no seu PC, é que suas pastas .svn saber que é o código do passado, por isso requer uma atualização antes de qualquer cometer.

Encontre o número boa revisão e revert

  1. Encontre o número de revisão da cópia antiga que quiser. Obtenha seu revisão atual com:

    svn info --show-item revision
    # or
    svn log
    

    Ou use:

    svn update -r <earlier_revision_number>
    

    para verificar várias versões mais antigas do seu projeto, até encontrar o número de revisão direita.

  2. Nota para baixo o número boa revisão (assumindo 123 para os exemplos abaixo).

  3. Atualização para última revisão:

    svn update
    
  4. desfazer todas as alterações entre a revisão você quer e a versão mais recente:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"
    

    (o mesmo que a resposta de Jon Skeet acima.)

Se você não pode encontrar o número de revisão

Se você não consegue encontrar a cópia antiga, e você só quer cometer os arquivos atualmente em seu PC:

  1. Faça uma cópia de sua versão boa (mas sem quaisquer pastas .svn):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
    
  2. Agora, verifique se você tem a versão mais recente:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
    
  3. Copie a sua versão bem sobre a parte superior da cópia de trabalho.

    Este comando irá copiar, e também apagar todos os arquivos da árvore de trabalho que não estão em sua boa cópia, mas isso não afetará as pastas .svn existentes.

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/
    

    Se você não tem rsync, você pode usar cp -a mas você também terá de apagar todos os arquivos indesejados manualmente.

  4. Você deve ser capaz de cometer o que você tem agora.

    cd project
    svn commit "Reverted to good copy"
    

Basta usar esta linha

svn update -r yourOldRevesion

Você pode conhecer o seu actual revisão usando:

info svn

A forma padrão de utilização de mesclagem para desfazer todo o check-in funciona muito bem, se é isso que você quer fazer. Às vezes, porém, tudo o que você quer fazer é reverter um único arquivo. Não há nenhuma maneira legítima de fazer isso, mas não é um hack:

  1. Encontre a versão que você quiser usando svn log.
  2. Usar svn exportação subcomando:

    svn exportação http: // url-to-your-file @ 123 / tmp / filename

(onde 123 é o número de revisão para uma boa versão do arquivo.) Em seguida, mover ou copiar esse único arquivo para substituir o antigo. Verifique no arquivo modificado e está feito.

um pouco mais old-school

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

então o habitual

svn diff
svn commit

Eu acho que isso é mais adequado:

Faça o inverso fusão, por exemplo, se o código comprometido contém a revisão de rev 5612-5616, apenas fundi-lo para trás. Ele funciona no meu fim.

Por exemplo:

svn merge -r 5616:5612 https://<your_svn_repository>/

Seria conter uma volta código resultante da concentração ex revisão, então você pode cometê-lo.

Isto é o que eu fiz e funcionou para mim.

Eu quero desfazer as alterações em vários commits que eu fiz para certos momentos e quer ir para a submissão anterior ponto.

  1. Vá para Team -.> Mostrar Histórico
  2. Clique com o botão direito do mouse no ou intervalo de revisões que deseja ignorar.
  3. Selecione a opção "Reverter alterações" opção.

Isso irá executar uma integração inversa, desfazendo as mudanças em sua cópia de trabalho.

Basta rever o código e cometer.

Clique com o botão direito do mouse sobre o maior hierarquia pretende reverter >> Revert ou Revert to Revision

Clique direito o projeto> Substituir> Revisão ou URL> Selecione a revisão específica que deseja reverter.

Agora comprometer a versão do código de atualização local para o repositório. Isto irá reverter o código base para a revisão específica.

A maioria das respostas anteriores foram usando uma fusão reversa, e que normalmente é a resposta certa. No entanto, há uma situação (o que acabou de acontecer comigo) onde não é.

eu acidentalmente mudou um arquivo com Unix finais de linha para fins de linha DOS ao fazer uma pequena mudança, e cometeu. Isso é facilmente desfeito, seja alterando os fins de linha e cometer novamente, ou por uma integração inversa, mas tem o efeito de fazer lista svn blame minha edição como a fonte de todas as linhas do arquivo. (Curiosamente, TortoiseSVN no Windows não ficar afectado por este;. Apenas o svn blame linha de comando)

Se você quiser manter a história como relatado por svn blame, eu acho que você precisa fazer o seguinte:

  • Exclua o arquivo e se comprometer.
  • No repositório, copie a cópia boa anterior do arquivo na cabeça, e comprometer-se.
  • Restaurar todas as edições que você deseja manter.

A exclusão é um pouco assustador, mas lembre-se que você sempre tem o arquivo salvo no repositório, assim restaurando não é um grande negócio. Aqui está algum código para ilustrar os passos. Suponha que xxx é o número de revisão da última boa cópia.

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

Note que uma cópia no repositório, as necessidades destino a ser um diretório, não um nome de arquivo.

Sync para a versão mais antiga e cometê-lo. Isso deve fazer o truque.

Eis também uma explicação de desfazer alterações.

A resposta de Jon Skeet é praticamente a solução em poucas palavras, no entanto, se você é como eu, você pode querer uma explicação. A subversão chamadas manuais isso um

Cherry-Pick Mesclar

A partir das páginas do manual.

  1. Este formulário é chamado uma mesclagem 'cherry-pick': 'N -r: M' refere-se à diferença na história do ramo de origem entre revisões N e M.

    A 'gama inversa' pode ser usado para anular as alterações. Por exemplo, quando origem e de destino se referem ao mesmo ramo, um cometido anteriormente revisão pode ser 'desfeita'. Num gama inversa , N é maior que M, em 'N -r: M', ou a opção '-c' é utilizado com um número negativo: '-c -M' é equivalente a '-r M:'. desfazer alterações como este também é conhecido como realizar uma 'fusão reversa'.


  • Se a fonte for um arquivo, em seguida, as diferenças são aplicadas para que arquivo (útil para inverter-mesclar as alterações anteriores). De outra forma, Se a fonte for um diretório, em seguida, os padrões de destino para ''.

    No uso normal, a cópia de trabalho deve ser atualizado, em um único revisão, sem modificações locais e não ligado subtrees.

Exemplo:

svn merge -r 2983:289 path/to/file

Isto irá substituir a cópia local [2983] (que, de acordo com a citação acima, deve estar em sincronia com o servidor - sua responsabilidade) com a revisão 289 do servidor. A mudança acontece localmente, o que significa que se você tem um check-out limpo, em seguida, as alterações podem ser inspecionados antes de cometê-los.

Há um monte de respostas perigosas nesta página. Note-se que desde SVN versão 1.6, fazer uma atualização -r pode causar conflitos de árvore, que se agrava rapidamente em um potencialmente perda de dados kafkeresque pesadelo onde você está pesquisando para obter informações sobre conflitos de árvore.

A maneira correta de reverter para uma versão é:

svn merge -r HEAD:12345 .

Onde 12345 é o número da versão. Não se esqueça do ponto.

A seguir tem trabalhado para mim.

Eu tinha um monte de mudanças locais e necessário para descartar aqueles na cópia local e fazer o checkout da última versão estável no SVN.

  1. Verifique o estado de todos os arquivos, incluindo os arquivos ignorados.

  2. Grep todas as linhas para obter os arquivos recém-adicionados e ignorados.

  3. Substitua aqueles com //.

  4. e rm -rf todas as linhas.

    svn status de --no-ignore | grep '^ [I?]' | sed "s / ^ // [I?]" | xargs -I {} rm -rf "{}"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top