Commits partiels avec Subversion

104

Étant donné le cas, j'ai fait deux changements indépendants dans un seul fichier: par exemple. a ajouté une nouvelle méthode et changé une autre méthode.

Je ne veux souvent pas valider les deux changements comme un seul commit, mais comme deux commits indépendants.

Sur un référentiel git, j'utiliserais le mode interactif de git-add (1) pour diviser le morceau en plus petits:

 git add --patch

Quelle est la façon la plus simple de faire cela avec Subversion? (Peut-être même en utilisant un plug-in Eclipse)

Mise à jour:
dans The Thing About Git , Ryan l'appelle: "The Tangled Working Copy Problem".

Benedikt Waldvogel
la source
Recherchez-vous spécifiquement une solution sur la ligne de commande? Beaucoup de réponses ci-dessous mentionnent TortoiseSVN «restaurer après validation», qui est une fonctionnalité réservée à Tortoise - donc basée sur l'interface graphique et Windows.
florisla

Réponses:

35

Avec git-svn, vous pouvez créer un référentiel GIT local du référentiel SVN distant, travailler avec lui en utilisant l'ensemble de fonctionnalités GIT complet (y compris les validations partielles), puis tout renvoyer vers le référentiel SVN.

git-svn (1)

jkramer
la source
25
Il y a une ironie particulière dans cette solution.
tuxayo
65

Tortoise SVN 1.8 prend désormais en charge cela avec sa fonction "Restaurer après validation". Cela vous permet d'apporter des modifications à un fichier, toutes les modifications étant annulées après la validation

Selon la documentation:

Pour ne valider que les parties du fichier liées à un problème spécifique:

  1. dans la boîte de dialogue de validation, faites un clic droit sur le fichier, choisissez "restaurer après validation"
  2. éditez le fichier par exemple dans TortoiseMerge: annulez les changements que vous ne voulez pas encore valider
  3. enregistrer le fichier
  4. valider le fichier
Casebash
la source
Je me demande comment cela fonctionne. J'ai vérifié les notes de publication de SVN 1.8 , mais je n'arrive pas à comprendre sur quelle fonctionnalité "Restaurer après validation" est basée.
DavidS
3
@DavidS Ce n'est pas une fonctionnalité de SVN. C'est une fonctionnalité de TortoiseSVN.
florisla
Pour info, SVN 1.8 est EOL à partir d'avril 2018 avec la sortie de 1.10
Greg K
On peut aussi le trouver dans la documentation ici: tortoisesvn.net/docs/release/TortoiseSVN_en/...
Guillaume Husta
42

J'ai fait cela en utilisant TortoiseSVN .

L'utilitaire de fusion intégré vous permet d'afficher une différence entre la version du référentiel et votre copie de travail.

Utilisez la fonction de création de sauvegarde de l'utilitaire diff

  1. Allez valider votre fichier comme si vous alliez valider toutes vos modifications.
  2. Dans la fenêtre de validation, double-cliquez sur le fichier pour afficher une différence.
  3. Dans les paramètres de diff, cliquez sur l'option de sauvegarde du fichier d'origine .
  4. Cliquez avec le bouton droit de la souris sur les modifications que vous ne souhaitez pas et utilisez la sélection pour utiliser un autre bloc de texte .
  5. Enregistrez le diff exactement une fois . La sauvegarde sera écrasée à chaque fois que vous enregistrez. C'est pourquoi vous ne souhaitez enregistrer qu'une seule fois.
  6. Validez le changement.
  7. Remplacez l'original par le fichier .bak créé (qui aura toutes vos modifications d'origine).
  8. Validez votre fichier.

Vous devriez maintenant avoir toutes vos modifications validées, en utilisant deux validations distinctes.

Pointe
la source
1
Comment avez-vous fait cela exactement? J'aimerais apprendre cette technique.
Lasse V. Karlsen
Ce serait tellement bien si cela écrasait automatiquement avec les fichiers .bak après une validation.
BCS
Je n'ai pas trouvé l'étape 3: Option de sauvegarde, en utilisant Tortoise SVN 1.8.1
sudhAnsu63
4
Ça ne fait rien. Trouvé le lien correspondant pour 1.8 tortoisesvn.net/tsvn_1.8_releasenotes.html Pour ne valider que les parties du fichier qui se rapportent à un problème spécifique: dans la boîte de dialogue de validation, faites un clic droit sur le fichier, choisissez "restaurer après validation" éditez le fichier par exemple TortoiseMerge: annulez les modifications que vous ne voulez pas encore valider, enregistrez le fichier
validez
Malheureusement, cela ne semble pas être disponible dans Tortoise version 1.8.5, ni "restaurer après validation".
kajaco
24

Essayez d'utiliser svn diff > out.patchpuis copiez le out.patchfichier dans out.patch.addetout.patch.modify

Ce n'est que lorsque vous avez un fichier de correctif fonctionnel que vous rétablissez le fichier d'origine en utilisant svn revert out.c.

Modifiez les fichiers de correctifs à la main afin qu'ils ne contiennent que les morceaux à ajouter ou à modifier. Appliquez-les au fichier d'origine à l'aide de la patchcommande, testez si l'ajout a fonctionné, puis svn commitl'ajout.

Laver le rinçage répéter pour le out.patch.modifypatch.

Si les modifications sont séparées dans le fichier comme votre question initiale l'a indiqué - ajout d'une nouvelle méthode, modification d'une méthode existante - cela fonctionnera

C'est une solution très fastidieuse - même si je ne suis pas convaincu que vous devriez avoir une raison de séparer vos commits.

Vous pourriez également avoir extrait plusieurs copies de travail de la même source pour appliquer votre travail à:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Assurez-vous svn upet testez pour vous assurer que tout va bien.

Chris
la source
11

Ceci est possible en utilisant TortoiseSvn (Windows) depuis la v1.8.

4.4.1. La boîte de dialogue de validation

Si votre copie de travail est à jour et qu'il n'y a pas de conflit, vous êtes prêt à valider vos modifications. Sélectionnez n'importe quel fichier et / ou dossier que vous souhaitez valider, puis TortoiseSVN → Valider ....

<snip>

4.4.3. Valider uniquement certaines parties des fichiers

Parfois, vous souhaitez valider uniquement certaines parties des modifications que vous avez apportées à un fichier. Une telle situation se produit généralement lorsque vous travaillez sur quelque chose, mais qu'un correctif urgent doit être validé, et ce correctif se trouve dans le même fichier sur lequel vous travaillez.

faites un clic droit sur le fichier et utilisez Menu contextuel → Restaurer après validation. Cela créera une copie du fichier tel quel. Ensuite, vous pouvez éditer le fichier, par exemple dans TortoiseMerge et annuler toutes les modifications que vous ne voulez pas valider. Après avoir enregistré ces modifications, vous pouvez valider le fichier.

Une fois la validation terminée, la copie du fichier est automatiquement restaurée et vous disposez du fichier avec toutes vos modifications qui n'ont pas été validées.

Sous Linux, je voudrais essayer http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php . Je n'ai pas essayé moi-même, cependant.

parvus
la source
8

J'avais l'habitude de faire ceci:

  • Dans mon éditeur (j'utilise vim), éditez le fichier pour qu'un seul des changements apparaisse
  • Enregistrez le fichier (mais ne quittez pas l'éditeur)
  • Validez le fichier modifié dans svn
  • Appuyez sur "Annuler" dans l'éditeur suffisamment de fois pour que le deuxième ensemble de modifications réapparaisse
  • Enregistrez à nouveau le fichier
  • Validez le deuxième ensemble de modifications.

Il s'agit d'une approche simpliste qui suppose qu'un ensemble de modifications est raisonnablement facile à annuler. Pour des situations plus complexes, j'abandonnerais et je commettrais les deux changements sans m'en soucier.

Maintenant que j'utilise git, c'est quelque chose que j'espère que je n'aurai plus jamais à refaire!

Greg Hewgill
la source
4

J'utilise soit un repo darcs local, soit je fusionne les modifications progressivement. Avec la fusion (opendiff ouvre FileMerge, un programme de fusion fourni avec Xcode; remplacez-le par votre outil de fusion préféré):

cp file file.new
svn revert file
opendiff file.new file -merge file

fusionner les modifications associées, enregistrer la fusion, quitter le programme de fusion

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

si plus d'un morceau non lié dans le fichier, rincez et répétez (mais pourquoi attendriez-vous si longtemps avant de vous engager?!)

De plus, si vous connaissez git, vous pouvez utiliser git-svn pour maintenir un dépôt git local et synchroniser vos commits sur un serveur maître svn; fonctionne très bien dans mon expérience limitée.

Temps infini
la source
9
Re: "Pourquoi attendre si longtemps?" Vous faites un gros refactor toute la journée et le boss laisse tomber un petit bug à corriger juste avant le déjeuner.
BCS
4

Essayez VisualSVN pour Visual Studio . La dernière version 6.1 introduit la fonction QuickCommit. Vous pouvez valider partiellement les modifications sélectionnées dans un fichier à l'aide des nouvelles commandes de menu contextuel Valider ce bloc et Valider la sélection dans l'éditeur Visual Studio.

entrez la description de l'image ici

bahrep
la source
2
  1. Ouvrez tous les fichiers que vous souhaitez diviser dans l'éditeur de votre choix
  2. En utilisant un ensemble d'outils différent (sur Win, utilisez la suggestion de Spike (l'ancienne version)) pour retirer le deuxième ensemble
  3. Commettre
  4. retournez dans l'éditeur de votre choix et enregistrez tous les fichiers

C'est un peu plus risqué que la suggestion complète de Spike mais peut être plus facile à faire. Assurez-vous également de l'essayer sur autre chose en premier, car certains éditeurs refuseront d'enregistrer un fichier qui a changé à moins que vous ne rechargiez ce fichier (perdant toutes vos modifications)

BCS
la source
0

Je pense qu'une option plus simple que de générer des fichiers de différence, de revenir en arrière, etc. serait d'avoir deux copies du référentiel extraites et d'utiliser un outil de comparaison visuel comme DeltaWalker pour copier les morceaux de l'un à l'autre.

La première copie serait celle sur laquelle vous travaillez réellement, et la seconde serait juste à cette fin. Une fois que vous avez apporté une tonne de modifications à la première, vous pouvez copier une section dans la seconde, la valider, copier une autre section, la valider, etc.

Ian Dunn
la source
0
  1. Copiez tous les fichiers modifiés concernés vers des copies de sauvegarde.
  2. Créez un patch de l'état de fonctionnement à l'aide de svn diff.
  3. Rétablissez les fichiers en utilisant svn revert.
  4. Réappliquez les parties du patch que vous souhaitez valider, soit à l'aide de l' patchoutil, soit par édition manuelle, ou autre.
  5. Exécutez diffensuite pour comparer votre copie de travail avec votre sauvegarde pour vous assurer que vous avez correctement appliqué les parties du patch.
  6. Construisez et testez.
  7. Commettre.
  8. Copiez vos copies de sauvegarde dans l'extraction de votre référentiel.
  9. Répétez à 2. (pas à 1.!) Jusqu'à ce que vous ayez terminé.
Michaeljt
la source