Comment ignorer les modifications locales dans une caisse SVN?

197

Je voulais soumettre un diff pour examen, pour un projet Open Source.

J'ai obtenu le code en utilisant SVN (depuis le terminal, Ubuntu). Et j'ai fait des modifications mineures dans quelques fichiers. Maintenant, je ne souhaite soumettre qu'une seule modification. Les autres modifications que j'ai apportées concernaient le débogage et ne sont plus nécessaires.

J'ai généré un diff en utilisant svn di > ~/os/firstdiff.diff

Donc ma question, comment rejeter mes modifications locales?

Existe-t-il un moyen SVN de le faire? Sinon, je devrai aller dans chaque fichier et supprimer toutes mes modifications. Ensuite, je générais un nouveau diff et le soumettais.

Vinayak Garg
la source

Réponses:

253

Utilisez simplement la svn revertcommande, par exemple:

svn revert some_file.php

Elle est (comme toutes les autres commandes svn) bien documentée dans la ressource ou la page de manuel svnbook , ou même avec la svn helpcommande.

Cédric Julien
la source
2
Sauf que Vinayak pourrait vouloir garder ses changements locaux sans intérêt pour lui.
Basile Starynkevitch
2
@BasileStarynkevitch: J'ai relu la question, et il semble que les autres modifications ne sont pas nécessaires: "" "Le reste des modifications que j'ai apportées concernaient essentiellement le débogage et ne sont plus nécessaires." "" :)
Cédric Julien
1
Oui ... mais il pourrait vouloir les garder plus loin pour lui ... (Sa question pourrait être comprise dans les deux sens).
Basile Starynkevitch
193

Vous devez annuler toutes les modifications à l'aide de la commande svn revert :

  • Annuler les modifications apportées à un fichier: svn revert foo.c
  • Rétablir tout un répertoire de fichiers: svn revert --recursive .
Alberto Spelta
la source
1
la référence à svn 1.1 est un peu ancienne, malgré le fait qu'il s'agit du premier lien donné par google ;)
Cédric Julien
apparemment, certains caractères de votre nom de fichier peuvent être ignorés. par exemple [email protected]. svn revert [email protected]. svn dit "Icon" ignoré.
topwik
1
C'est la meilleure réponse. Cela devrait être vérifié.
rickfoosusa
12
Le svn revert --recursive .me aide beaucoup .
Paul Vargas
Cela devrait être la réponse acceptée, car le --recursiveparamètre annule tous les changements locaux et c'est la question.
arueckauer
15

Pour ignorer les modifications locales dans un fichier particulier:

$ svn revert example_directory/example_file.txt

Pour ignorer les modifications locales dans un dossier particulier:

$ svn revert -R example_directory/
batigolix
la source
7

Simple svn revertétait suffisant pour l'affiche originale. Cependant, un simple svn revertne suffira pas dans le cas plus général où vous

  1. avoir à la fois des modifications que vous souhaitez partager et des modifications que vous ne souhaitez pas partager dans le même fichier ,
  2. avoir des changements locaux que vous souhaitez toujours conserver pour votre propre bénéfice .

La suggestion de @ ErichBSchulz d'utiliser git add -pest très raisonnable et beaucoup plus généralement applicable dans un tel cas. La réponse manquait juste de quelques détails. En supposant que votre répertoire actuel est le répertoire que vous souhaitez créer le patch partageable, vous pouvez faire quelque chose comme ceci:

  1. Extraire la version vierge de subversion vers un répertoire différent (choisissez un nom de répertoire qui n'existe pas, ici en utilisant le sous-répertoire TMP/).

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. En utilisant cette extraction svn vierge comme base, lancez un référentiel git, en ignorant les répertoires .svn; tout valider dans svn head vers votre dépôt git temporaire

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. Copiez les métadonnées du référentiel git nouvellement préparées dans votre répertoire de travail d'origine; comme le répertoire de vérification de subversion vierge n'est pas nécessaire, vous pouvez vous en débarrasser. Votre répertoire de travail est maintenant à la fois le dépôt git et subversion:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. Vous pouvez maintenant utiliser puissant et pratique git add -ppour choisir de manière interactive exactement ce que vous souhaitez partager et les valider dans votre référentiel git. Si vous devez ajouter des fichiers au commit, faites-le également git add <file-to-add>avantgit 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. À l'aide de la validation, préparez un correctif que vous souhaitez partager. À cette fin, vous pouvez également utiliser git diff HEAD^..HEAD, ou git format-patch(ce dernier peut être utilisé pour préparer directement les e-mails à envoyer contenant le ou les plusieurs correctifs):

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

Pour vous débarrasser des métadonnées git, faites-le rm -rf .git/. Si vous prévoyez de continuer le piratage avec le répertoire de travail d'origine, vous pouvez continuer à utiliser gitpour gérer vos modifications locales. Dans ce cas, vous bénéficierez probablement de l'investissement pour apprendre à utiliser git svn.

Remarque: Si vous êtes familier avec gitcela, c'est une chose assez banale à improviser. Sinon, cela semble peut-être un peu désordonné. Vous pouvez généraliser l'approche en écrivant un script à partir de ces étapes pour implémenter un "commit interactif" ou une "création de patch interactif" pour svn qui pourrait être utilisé sans aucune compréhension de git.

FooF
la source
3
Merci beaucoup pour l'anonyme -1 sans aucune explication. Quoi qu'il en soit, j'ai pris le temps d'améliorer la réponse en précisant quand cette approche avait du sens.
FooF
2
Merci beaucoup pour votre expansion. +1 de moi! Ne t'inquiète pas. Foule difficile.
ErichBSchulz
1
Merci pour le pouce levé, @ErichBSchulz! Lentement, nous faisons du monde un meilleur endroit où vivre malgré les adversaires !!! ;-)
FooF
4

Vous pourriez utiliser

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

Lors de la publication de votre diff, n'oubliez pas d'indiquer la révision par rapport à laquelle vous différez.

Comme d'autres l'ont répondu, vous pouvez également l'utiliser svn revertavec précaution. Cela dépend si vous souhaitez conserver vos modifications locales pour votre futur travail ou non ...

Basile Starynkevitch
la source
+1 C'est la meilleure solution au problème, mais dans ce cas, je voulais vraiment me débarrasser de tous mes changements. Bien sûr, je ne voudrais pas toujours revertmes changements. J'utiliserais donc votre chemin à l'avenir.
Vinayak Garg
3

Accédez à la racine de ce référentiel et exécutez la commande suivante

svn revert --depth=infinity .
Bunty
la source
1
svn revert -R .pourrait être plus court
jesjimher
1

Vous pouvez utiliser la commande commit sur le fichier que vous souhaitez placer et utiliser la commande svn revert pour ignorer les modifications locales restantes

jlemos
la source