Come annullare le modifiche locali in un checkout SVN?


197

Volevo presentare un diff per la revisione, per un progetto Open Source.

Ho ottenuto il codice usando SVN (dal terminale, Ubuntu). E ho fatto piccole modifiche in pochi file. Ora c'è solo una singola modifica che voglio presentare. Il resto delle modifiche che ho apportato riguardava il debug e non è più necessario.

Ho generato diff utilizzando svn di > ~/os/firstdiff.diff

Quindi la mia domanda, come scartare le mie modifiche locali?

C'è un modo SVN per farlo? In caso contrario, dovrò andare su ogni file ed eliminare tutte le mie modifiche. Quindi vorrei generare un nuovo diff e inviarlo.

Risposte:


253

Basta usare il svn revertcomando, ad esempio:

svn revert some_file.php

È (come ogni altro comando svn) ben documentato nella risorsa svnbook o nella pagina man, o addirittura con il svn helpcomando.


2
Tranne il fatto che Vinayak potrebbe voler mantenere i suoi cambiamenti poco interessanti per se stesso.
Basile Starynkevitch,

2
@BasileStarynkevitch: ho letto di nuovo la domanda e sembra che le altre modifiche non siano necessarie: "" "Il resto delle modifiche che ho apportato erano essenzialmente per il debug e non sono più necessarie." "" :)
Cédric Julien,

1
Sì ... ma potrebbe volerli mantenere ulteriormente per se stesso ... (La sua domanda potrebbe essere compresa in entrambi i modi).
Basile Starynkevitch,

193

Devi ripristinare tutte le modifiche usando il comando svn revert :

  • Ripristina modifiche in un file: svn revert foo.c
  • Ripristina un'intera directory di file: svn revert --recursive .

1
il riferimento a svn 1.1 è un po 'vecchio, nonostante sia il primo link fornito da google ;)
Cédric Julien,

apparentemente alcuni caratteri nel tuo nome file possono essere ignorati. ad esempio icon@2x.png. svn ripristina icon@2x.png. svn dice 'Icona' saltata.
topwik

1
Questa è la risposta migliore Dovrebbe essere controllato.
rickfoosusa,

12
Il svn revert --recursive .mi aiuta molto .
Paul Vargas,

Questa dovrebbe essere la risposta accettata, poiché il --recursiveparametro ripristina eventuali modifiche locali e questa è la domanda.
Arueckauer,

15

Per annullare le modifiche locali in un determinato file:

$ svn revert example_directory/example_file.txt

Per annullare le modifiche locali in una cartella specifica:

$ svn revert -R example_directory/

7

Semplice svn revertera abbastanza per il poster originale. Tuttavia, un semplice svn revertnon lo farà nel caso più generale in cui tu

  1. avere entrambe le modifiche che si desidera condividere e le modifiche che non si desidera condividere nello stesso file ,
  2. avere modifiche locali che sei ancora interessato a mantenere per il tuo vantaggio privato .

Il suggerimento di @EerichBSchulz di utilizzare git add -pè molto ragionevole e molto più generalmente applicabile in tal caso. Alla risposta mancavano solo alcuni dettagli. Supponendo che la tua directory corrente sia la directory in cui vuoi creare la patch condivisibile, potresti fare qualcosa del genere:

  1. Verifica la versione originale dalla sovversione a una directory diversa (scegli un nome di directory che non esiste, qui usando la sottodirectory TMP/).

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. Usando quel checkout svn originale come base, avvia un repository git, ignorando le directory .svn; esegui il commit di tutto in testa svn nel tuo repository git temporaneo

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. Copia i metadati del repository git appena preparati nella directory di lavoro originale; poiché non è necessaria la directory di checkout di sovversione incontaminata, puoi eliminarla. La tua directory di lavoro ora è sia repository git che subversion:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. Ora puoi usare potente e conveniente git add -pper scegliere in modo interattivo esattamente ciò che vuoi condividere e impegnarli nel tuo repository git. Se è necessario aggiungere file al commit, eseguire anche git add <file-to-add>primagit 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. Utilizzando il commit, preparare una patch che si desidera condividere. A tale scopo, è anche possibile utilizzare git diff HEAD^..HEAD, oppure git format-patch(quest'ultima può essere utilizzata per preparare direttamente le e-mail da inviare contenenti la patch o più patch):

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

Per sbarazzarsi dei metadati git, basta farlo rm -rf .git/. Se prevedi di continuare a hackerare con la directory di lavoro originale, puoi continuare a utilizzare gitper gestire le modifiche locali. In questo caso probabilmente trarrai vantaggio dall'investimento nell'apprendimento dell'uso git svn.

Nota: se hai familiarità con gitquesta cosa è piuttosto banale improvvisare. Altrimenti questo sembra forse un po 'disordinato. Puoi generalizzare l'approccio scrivendo uno script di questi passaggi per implementare un "commit interattivo" o "creazione di patch interattive" per svn che potrebbe essere usato senza alcuna comprensione di git.


3
Grazie mille per l'anonimo -1 senza alcuna spiegazione. Ad ogni modo, mi sono preso il tempo per migliorare la risposta chiarendo quando questo approccio ha senso.
FooF,

2
Grazie mille foof per l'espansione. +1 da me! Non ti preoccupare. Folla dura.
ErichBSchulz,

1
Grazie per il pollice in alto, @ErichBSchulz! Lentamente stiamo rendendo il mondo un posto migliore in cui vivere nonostante gli avversari !!! ;-)
FooF

4

Puoi usare

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

Quando pubblichi il tuo diff, non dimenticare di dire la revisione contro la quale stai differendo.

Come altri hanno risposto, potresti anche usare svn revertcon attenzione. Dipende se vuoi mantenere le modifiche locali per il tuo lavoro futuro o no ...


+1 Questa è la migliore soluzione al problema, ma in questo caso volevo davvero sbarazzarmi di tutte le mie modifiche. Certo, non vorrei che i revertmiei cambiamenti venissero continuamente. Quindi userei la tua strada in futuro.
Vinayak Garg,

3

Vai alla radice di quel repository ed esegui il seguente comando

svn revert --depth=infinity .

1
svn revert -R .potrebbe essere più breve
jesjimher,

1

È possibile utilizzare il comando commit sul file che si desidera inserire e utilizzare il comando svn revert per annullare le restanti modifiche locali

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.