Revertendo um arquivo único no SVN para uma revisão específica


182

Eu tenho um arquivo como mostrado abaixo em um repo SVN que gostaria de reverter para uma versão anterior. Qual é a maneira de fazer isso no SVN? Eu quero apenas fazer o downgrade desse arquivo específico para uma versão mais antiga, não o repositório inteiro.

Obrigado.

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial

quando você disse reverter, o que você quis dizer com isso, 7 anos atrás, lol
Kalpesh Soni

Respostas:


181

Se você deseja apenas o arquivo antigo em sua cópia de trabalho:

svn up -r 147 myfile.py

Se você quiser reverter, veja este tópico " Como retornar para uma versão mais antiga do nosso código no subversion? ".


8
mas da próxima vez que você atualiza, obtém o arquivo que você não queria voltar ...: S
andygoestohollywood

2
se você não o quer de volta, svn comprometa esse arquivo, para colocar a versão que você deseja no repositório
Packet Tracer

14
Provavelmente, isso realmente não faz o que o autor da pergunta queria. Usando isso, a cópia de trabalho está limpa e não pode ser confirmada COMO ESTÁ, e uma "atualização svn" sem um número de versão especificado recuperará a versão indesejada mais recente.
CXJ

1
Como posso confirmar o arquivo revertido?
marcio

2
Isso não está certo porque, como CXJ menciona, não há uma maneira de confirmar o arquivo atualizado. Você provavelmente quer fazer como diz Mitch Dempsey (note, no entanto, o force para forçar a substituição do ficheiro): svn exportação --force -r 147 myfile.py myfile.py
avejidah

76

O svn cat também faz uma revisão!

svn cat -r 175 mydir/myfile > mydir/myfile


20
Esta é de longe a melhor resposta na página. Deixa o arquivo alterado em um estado que pode ser confirmado.
dotancohen

este não parece trabalho quando você está colando em um novo arquivo
ahnbizcad

haha olhando para trás, idk em que contexto eu estava pensando quando postei. Não me lembro. Parece sem sentido.
ahnbizcad

Isso é simples e direto para quando você simplesmente deseja desfazer suas alterações e recuperar um arquivo em seu estado de pré-confirmação sem nenhum detalhe técnico de controle de versão.
Anônimo

57
svn revert filename 

isso deve reverter um único arquivo.


4
O que há com todas as outras respostas com comandos mais longos? Obrigado.
Masterdilo #

Você é bem vindo. Eu não tenho nenhuma idéia do que se passa com outras respostas .. lol
thestar

13
Isso reverte para qual revisão? Doc diz que apenas substitui o mais recente no repo. A questão é como reverter para uma versão anterior.
tgkprog

1
Isso reverte para a versão mais recente do repo. Se você ler a descrição das perguntas, parece que ele estava procurando como reverter um único arquivo, não o diretório inteiro.
thestar 29/10

5
Acredito que tudo o que isso faz é destruir sua cópia de trabalho 'revertendo-a' de volta à cabeça. Ou para o que já foi verificado. confirme fazendo o arquivo svn update -r VER e faça um svn revert.
precisa saber é o seguinte

50

Para um único arquivo, você pode fazer:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

Você poderia fazer svn revert <file>isso, mas isso restaurará apenas a última cópia de trabalho.


2
exportar, colá-lo na sua cópia local e enviá-lo novamente?
tgkprog 17/09/2013

1
@tgkprog que é uma maneira de fazê-lo, sim
Mitch Dempsey

@tgkprog e qual é a maneira "preferida"?
Hbogert 28/10

Não faço ideia, mas foi o que funcionou para mim: revisão passada exportada. Aberto no bloco de notas, copiado e colado no arquivo de trabalho. Cometi isso para comentar com qual rotação e por quê. As ferramentas de interface do usuário podem ter uma maneira melhor.
tgkprog

21

Até agora, todas as respostas aqui parecem ter desvantagens significativas, são complicadas (precisam encontrar o URI do repo) ou não fazem o que a pergunta provavelmente pediu: Como colocar o Repo novamente em um estado de funcionamento com a versão mais antiga do arquivo .

svn merge -r head:[revision-number-to-revert-to] [file-path]A IMO é a maneira mais limpa e simples de fazer isso. Observe que trazer de volta um arquivo excluído não parece funcionar dessa maneira [1]. Consulte também a seguinte pergunta: Melhor maneira de reverter para uma revisão SVN anterior de um arquivo?

[1] Para isso svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up, consulte também Qual é a maneira correta de restaurar um arquivo excluído do SVN?


Gostaria de observar que, pelo menos para a minha versão do Subversion, svn mergenão é necessário usar vários arquivos como argumento por algum motivo. Nesse caso, parece não fazer nada (sem uma mensagem de erro).
precisa saber é o seguinte

Mas meu comando ainda funciona repetindo-o para cada arquivo, certo?
Michel Müller

Sim, de fato.
Wrzlprmft

1
Concordou que este é o mais limpo.
KevinG

13

A melhor maneira é:

svn merge -c -RevisionToUndo ^/trunk

Isso desfará todos os arquivos da revisão do que simplesmente reverter os arquivos que você não gosta de desfazer. Não esqueça o dash ( -) como prefixo da revisão.

svn revert File1 File2

Agora confirme as alterações.


9

Você quer fazer

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

Depois de fazer isso, você terá a revisão do arquivo em um estado comprometível. Confirme o arquivo.


7

Achei simples fazer isso através do svn catcomando, para que você nem precise especificar uma revisão.

svn cat mydir/myfile > mydir/myfile

Provavelmente, isso não retrocederá os dados do inode (metadados), como registros de data e hora.


em seguida, cometer o arquivo para que ele vai para o repo
tgkprog

3
Isso funcionou para mim melhor do que atualizar. Como a atualização não permite confirmar a modificação feita nesse arquivo. (svn 1.8.3)
fe_lix_

7

surpreendeu ninguém mencionou isso

sem descobrir o número da revisão, você pode escrever isso, se você acabou de confirmar algo que deseja reverter, isso não funcionará se você tiver alterado outro arquivo e o arquivo de destino não for o último arquivo alterado

svn merge -r HEAD:PREV file

Se você tiver comentários, discuta aqui antes de fazer edições?
Kalpesh Soni

1
O cenário da pergunta não exige uma mesclagem reversa da alteração mais recente, para que possamos aplicar as alterações necessárias para passar de HEAD para PREV?
Nick Russo

4
O comando deve ser o svn merge -r HEAD:PREV fileque o @Nick Russo disse #
Heinz

4

Se forem apenas alguns arquivos e se você estiver usando o Tortoise SVN, poderá usar a seguinte abordagem:

  1. Clique com o botão direito do mouse no seu arquivo de origem e selecione "TortoiseSVN" -> "Mostrar log".
  2. Clique com o botão direito do mouse em uma revisão no log e selecione "Salvar revisão em ...".
  3. Deixe a revisão antiga sobrescrever seu arquivo atual.
  4. Confirme o arquivo de origem substituído.

Isso salva um novo arquivo não versionado, como arquivo-xxxx, em que xxxx é o número da revisão antiga. O que faremos a seguir? excluir a nova revisão (HEAD, por exemplo), renomear o novo arquivo, adicionar, confirmar?
Heinz

Não, não salve-o com o número da revisão no nome do arquivo. Salve-o com exatamente o mesmo nome de arquivo que a versão atual do mesmo arquivo (em outras palavras, nenhum xxxx no nome do arquivo). Depois, faça um commit comum depois disso.
Elling 06/02

4

Acabei de adicionar a resposta do @Mitch Dempsy, pois ainda não tenho representante suficiente para comentar.

svn export -r <REV> svn://host/path/to/file/on/repos --force

Adicionar o --force substituirá a cópia local pela exportação e, em seguida, você poderá executar um commit svn para enviá-lo ao repositório.


e esta é a melhor resposta :)
Zgr3doo

por que essa é a melhor resposta? não gerenciar o histórico do "svn caminho"
Jason S

2

Uma opção alternativa para um único arquivo é "substituir" a versão atual do arquivo pela revisão mais antiga:

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

Isso tem o recurso adicional de que as alterações indesejadas não aparecem no log desse arquivo (ou seja, svn log file.ext).


1

Se você deseja reverter um arquivo individual de uma revisão específica e conseguir confirmar, faça:

svn merge -c - [OldRev #] [Nome do arquivo]

ie svn merge -c -150 myfile.py

Observe o negativo no número da revisão


-1
sudo svn revert filename

esta é a melhor maneira de reverter um único arquivo


2
Eu realmente espero que você nunca chegue perto de uma máquina de produção com permissões de sudoer.
David Lakatos
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.