web-dev-qa-db-fra.com

Commits partiels avec Subversion

Dans ce cas, j’ai fait deux modifications indépendantes dans un fichier: par exemple. ajout d'une nouvelle méthode et modification d'une autre méthode.

Souvent, je ne veux pas valider les deux modifications en tant que one commit, mais en tant que two indépendants.

Sur un dépôt git, j'utiliserais le mode interactif de git-add (1) pour scinder le bloc 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)

Mettre à jour:
Dans La chose à propos de Git , Ryan l’appelle: «Le problème de la copie de travail enchevêtrée.»

96
Benedikt Waldvogel

Avec git-svn, vous pouvez créer un référentiel GIT local du référentiel SVN distant, l'utiliser avec l'ensemble des fonctionnalités de GIT (y compris les validations partielles), puis tout repousser dans le référentiel SVN.

git-svn (1)

32
jkramer

Tortoise SVN 1.8 supporte maintenant this avec sa fonctionnalité "Restore after commit". Cela vous permet d’éditer un fichier, toutes les éditions étant annulées après la validation.

Selon la documentation:

Pour ne valider que les parties du fichier relatives à 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 la validation"
  2. éditez le fichier, par exemple. TortoiseMerge: annule les modifications que vous ne voulez pas encore valider
  3. sauvegarder le fichier
  4. commettre le fichier
58
Casebash

J'ai fait cela en utilisant TortoiseSVN .

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

Utiliser la fonction créer une 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 un diff.
  3. Dans les paramètres de diff, cliquez sur l'option pour sauvegarder le fichier d'origine} _. 
  4. Cliquez avec le bouton droit de la souris sur les modifications que vous ne souhaitez pas utiliser, puis sélectionnez select utilisez 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 voulez enregistrer qu'une seule fois.
  6. Commettez le changement.
  7. Remplacez l'original par le fichier .bak créé (qui contiendra toutes vos modifications d'origine).
  8. Commettez votre fichier.

Toutes vos modifications doivent maintenant être validées, en utilisant deux validations distinctes.

42
Spike

Essayez d’utiliser svn diff > out.patch, puis copiez le fichier out.patch dans out.patch.add et out.patch.modify

Uniquement si vous avez un fichier de correctif fonctionnel retournez le fichier d'origine en utilisant svn revert out.c.

Éditez les fichiers de correctif à la main pour qu’ils ne contiennent que les mecs à ajouter ou à modifier. Appliquez-les au fichier d'origine à l'aide de la commande patch, testez si l'ajout a fonctionné, puis svn commit l'ajout.

Répétez le rinçage pour le patch out.patch.modify.

Si les modifications sont séparées dans le fichier comme indiqué dans votre question initiale - 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 convaincue que vous devriez avoir une raison de séparer vos commits.

Vous auriez également pu extraire 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 de svn up et testez pour vous assurer que tout va bien.

25
Chris

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

4.4.1. Le 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 les dossiers que vous souhaitez valider, puis TortoiseSVN → Valider ....

<snip>

4.4.3. N'engager que des parties de fichiers

Parfois, vous ne voulez valider que certaines parties des modifications apportées à un fichier. Une telle situation habituellement se passe lorsque vous travaillez sur quelque chose, mais alors une solution urgente a besoin être commis, et ce correctif se trouve être dans le même fichier que vous êtes travaille sur. 

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 annule toutes les modifications que vous ne voulez pas faire commettre. Après avoir enregistré ces modifications, vous pouvez valider le fichier. 

Une fois la validation effectuée, la copie du fichier est restaurée automatiquement, et vous avez le fichier avec toutes vos modifications que n'ont pas été renvoyés.

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

10
parvus

J'avais l'habitude de faire ceci:

  • Dans mon éditeur (j'utilise vim), éditez le fichier de sorte qu'un seul des changements apparaisse
  • Enregistrez le fichier (mais ne quittez pas l'éditeur)
  • Valider le fichier modifié dans svn
  • Appuyez sur "Annuler" dans l'éditeur suffisamment de fois pour que le deuxième ensemble de modifications réapparaisse
  • Sauvegarder le fichier à nouveau
  • Commettez 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 commettrais les deux modifications sans m'en soucier.

Maintenant que j'utilise git, c'est quelque chose que j'espère ne plus jamais avoir à faire!

8
Greg Hewgill

J'utilise soit un repo local Darcs, soit tout simplement fusionner 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 voudriez-vous attendre si longtemps avant de vous engager?!)

De plus, si vous connaissez git, vous pouvez utiliser git-svn pour gérer 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.

5
Aeon

Essayez VisualSVN pour Visual Studio . La dernière version 6.1 introduit la fonctionnalité 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 dans dans l'éditeur Visual Studio.

 enter image description here

3
bahrep
  1. Ouvrez tous les fichiers que vous souhaitez scinder dans l'éditeur de choix
  2. En utilisant un jeu d'outils différent (sous Win, utilisez la suggestion de Spike (l'ancienne version)), sortez le second jeu
  3. Commettre
  4. retournez dans l'éditeur de votre choix et sauvegardez 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 d’essayer d’abord quelque chose d’autre, car certains éditeurs refuseront de sauvegarder un fichier qui a été modifié, à moins de recharger ce fichier (perte de toutes vos modifications)

2
BCS

Je pense qu’une option plus facile que de générer des fichiers diff, de revenir en arrière, etc., consisterait à extraire deux copies du référentiel et à utiliser un outil de diff visuel comme DeltaWalker pour copier des morceaux de l’un à l’autre.

La première copie serait celle sur laquelle vous travailleriez, et la seconde ne servirait qu'à cette fin. Une fois que vous avez apporté une tonne de modifications à la première, vous pouvez copier une section sur la seconde, la valider, copier une autre section, la valider, etc.

0
Ian Dunn
  1. Copiez tous les fichiers modifiés concernés pour sauvegarder des copies.
  2. Créez un patch de l'état de fonctionnement en utilisant svn diff.
  3. Retournez les fichiers en utilisant svn revert.
  4. Réappliquez les parties du correctif que vous souhaitez valider, soit à l'aide de l'outil patch, soit par édition manuelle, ou peu importe.
  5. Exécutez ensuite diff pour comparer votre copie de travail à votre copie de sauvegarde afin de vous assurer que vous avez appliqué les correctifs correctement.
  6. Construire et tester.
  7. Commettre.
  8. Copiez vos copies de sauvegarde dans votre extraction de référentiel.
  9. Répéter à 2. (pas à 1.!) Jusqu'à la fin.
0
michaeljt