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.

Vinayak Garg
fonte

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

Cédric Julien
fonte
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 .
Alberto Spelta
fonte
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 [email protected]. svn revert [email protected]. 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/
batigolix
fonte
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.

FooF
fonte
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 ...

Basile Starynkevitch
fonte
+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 .
Bunty
fonte
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

jlemos
fonte