Como descartar alterações locais em um check-out de SVN?


197

Eu queria enviar uma comparação para revisão, para um projeto de código aberto.

Eu recebi o código usando SVN (do terminal, Ubuntu). E fiz edições menores em alguns arquivos. Agora, há apenas uma única alteração que desejo enviar. O restante das alterações que fiz foi para depuração e não é mais necessário.

Eu gerei diff usando svn di > ~/os/firstdiff.diff

Então, minha pergunta: como descartar minhas alterações locais?

Existe uma maneira SVN de fazer isso? Caso contrário, terei que ir para cada arquivo e excluir todas as minhas edições. Então eu geraria um novo diff e o enviaria.

Respostas:


253

Basta usar o svn revertcomando, por exemplo:

svn revert some_file.php

Ele (como todos os outros comandos svn) está bem documentado no recurso svnbook ou na página man, ou mesmo com o svn helpcomando


2
Só que Vinayak pode querer manter para si as mudanças locais desinteressantes.
Basile Starynkevitch 27/02/12

2
@BasileStarynkevitch: Li a pergunta novamente e parece que as outras alterações não são necessárias: "" "O restante das alterações que fiz foram basicamente para depuração e não são mais necessárias." "" :)
Cédric Julien

1
Sim ... mas ele poderia querer mantê-los ainda mais para si ... (Sua pergunta pode ser entendida nos dois sentidos).
Basile Starynkevitch 27/02

193

Você precisa reverter todas as alterações usando o comando svn revert :

  • Reverta as alterações em um arquivo: svn revert foo.c
  • Reverta um diretório inteiro de arquivos: svn revert --recursive .

1
referência para svn 1.1 é um pouco velho, apesar do fato de que ele é o primeiro elo dado pelo google ;)
Cédric Julien

aparentemente alguns caracteres no seu nome de arquivo podem ser ignorados. por exemplo icon@2x.png. svn revert icon@2x.png. svn diz 'Ícone' ignorado.
Topwik 19/03/2013

1
Esta é a melhor resposta. Deve ser verificado.
Rickfoosusa

12
A svn revert --recursive .me ajuda muito .
Paul Vargas

Essa deve ser a resposta aceita, pois o --recursiveparâmetro reverte todas as alterações locais e essa é a pergunta.
arueckauer

15

Para descartar alterações locais em um arquivo específico:

$ svn revert example_directory/example_file.txt

Para descartar alterações locais em uma pasta específica:

$ svn revert -R example_directory/

7

Simples svn revertfoi suficiente para o pôster original. No entanto, um simples svn revertnão funcionará no caso mais geral em que você

  1. tenha as edições que você deseja compartilhar e edições que não deseja compartilhar no mesmo arquivo ,
  2. tenha alterações locais que você ainda deseja manter em benefício próprio .

A sugestão do @ ErichBSchulz de usar git add -pé muito razoável e muito mais geralmente aplicável nesse caso. A resposta estava faltando alguns detalhes. Supondo que seu diretório atual seja o diretório que você deseja criar o patch compartilhável, você pode fazer algo assim:

  1. Faça o checkout da versão original do subversion para um diretório diferente (escolha um nome de diretório que não exista, aqui usando o subdiretório TMP/).

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. Usando esse svn checkout como base, inicie um repositório git, ignorando os diretórios .svn; comprometa tudo no svn head ao seu repositório temporário git

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. Copie os metadados do repositório git recém-preparados para o diretório de trabalho original; como o diretório de verificação de subversão não é necessário, você pode se livrar dele. Seu diretório de trabalho agora é o repositório git e subversion:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. Agora você pode usar o poderoso e conveniente git add -ppara escolher interativamente exatamente o que deseja compartilhar e enviá-los ao seu repositório git. Se você precisar adicionar arquivos à confirmação, faça também git add <file-to-add>antesgit commit

    $ git add -p                            
    <interactively select (and edit) the chunks you want to share>
    $ git add ${the_list_of_files_not_in_yet_in_svn_you_want_to_add}
    $ git commit
    
  5. Usando a confirmação, prepare um patch que você deseja compartilhar. Para esse fim, você também pode usar git diff HEAD^..HEAD, ou git format-patch(o último pode ser usado para preparar diretamente e-mails a serem enviados contendo o patch ou vários patches):

    $ git show -p HEAD > my-mighty-patch.patch
    

Para se livrar dos metadados do git, basta fazê-lo rm -rf .git/. Se você planeja continuar invadindo o diretório de trabalho original, pode continuar usando gitpara gerenciar suas alterações locais. Nesse caso, você provavelmente se beneficiaria do investimento em aprender a usar git svn.

Nota: Se você está familiarizado com gitisso, é algo trivial improvisar. Caso contrário, isso pode parecer um pouco confuso. Você pode generalizar a abordagem escrevendo um script com estas etapas para implementar um "commit interativo" ou "criação de patch interativa" para o svn que pode ser usado sem o conhecimento do git.


3
Muito obrigado por -1 anônimo, sem explicações. De qualquer forma, dediquei um tempo para melhorar a resposta, esclarecendo quando essa abordagem faz sentido.
Foof

2
Muito obrigado pela expansão. +1 de mim! Não se preocupe. Multidão resistente.
ErichBSchulz

1
Obrigado pelo voto, @ErichBSchulz! Lentamente, estamos tornando o mundo um lugar melhor para se viver, apesar dos adversários !!! ;-)
FooF

4

Você poderia usar

 svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff

Ao publicar o seu diff, não se esqueça de informar a revisão contra a qual você está enfrentando.

Como outros responderam, você também pode usar com svn revertcuidado. Depende se você deseja manter as alterações locais para o seu trabalho futuro ou não ...


+1 Esta é a melhor solução para o problema, mas, neste caso, eu realmente queria me livrar de todas as minhas alterações. Claro, eu não gostaria das revertminhas mudanças o tempo todo. Então, eu usaria o seu caminho no futuro.
Vinayak Garg

3

Vá para a raiz desse repositório e execute o seguinte comando

svn revert --depth=infinity .

1
svn revert -R .pode ser mais curto
jesjimher 15/06

1

Você pode usar o comando commit no arquivo que deseja colocar e usar o comando svn revert para descartar as alterações locais restantes

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.