Commit partiel avec Subversion

Étant donné le cas, j’ai effectué deux modifications indépendantes dans un fichier: par exemple. ajouté une nouvelle méthode et changé une autre méthode.

Je ne veux souvent pas commettre les deux modifications en une seule fois , mais en tant que deux commits indépendants.

Sur un repository git, j’utiliserais le mode interactif de git-add (1) pour diviser le morceau en plus petits:

git add --patch 

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

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

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 GIT (y compris les commits partiels), puis le renvoyer dans le référentiel SVN.

git-svn (1)

Tortoise SVN 1.8 supporte maintenant ceci avec sa fonctionnalité “Restore after commit”. Cela vous permet de modifier un fichier, toutes les modifications étant annulées après la validation

Par la documentation:

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

  1. Dans la boîte de dialog de validation, cliquez avec le bouton droit sur le fichier, choisissez “restaurer après validation”
  2. éditer le fichier dans par exemple TortoiseMerge: annuler les modifications que vous ne voulez pas encore commettre
  3. enregistrer le fichier
  4. commettre le fichier

Je l’ai fait 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.

Utilisez la fonction de sauvegarde de l’utilitaire diff

  1. Allez commettre votre fichier comme si vous alliez commettre toutes vos modifications.
  2. Dans la fenêtre de validation, double-cliquez sur le fichier pour afficher un diff.
  3. Dans les parameters 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 et utilisez select use other text block .
  5. Enregistrez le diff exactement une fois . La sauvegarde sera écrasée chaque fois que vous enregistrez. C’est pourquoi vous ne voulez épargner qu’une fois.
  6. Engagez 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 commits distincts.

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

Ce n’est que lorsque vous avez un fichier de patch en cours de fonctionnement que le fichier original est svn revert out.c avec svn revert out.c

Modifiez les fichiers de correctifs à la main afin qu’ils ne contiennent que les éléments à append ou à modifier. Appliquez-les au fichier d’origine à l’aide de la commande patch , testez si l’ajout a fonctionné, puis svn commit l’addition.

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

Si les modifications sont séparées dans le fichier au fur et à mesure de l’établissement de votre question initiale – ajout d’une nouvelle méthode, modification d’une méthode existante – cela fonctionnera

Ceci 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 avez également pu vérifier 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 vous svn up et de tester pour vous assurer que tout va bien.

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

4.4.1. La boîte de dialog 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 ….

4.4.3. Ne valider que des parties de fichiers

Parfois, vous souhaitez uniquement valider des parties des modifications apscopes à un fichier. Une telle situation se produit généralement lorsque vous travaillez sur quelque chose, mais un correctif urgent doit être activé et ce correctif se trouve dans le même fichier que celui 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 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 disposez du fichier contenant toutes vos modifications qui n’ont pas été validées.

Sur 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.

Je faisais ça:

  • Dans mon éditeur (j’utilise vim), éditez le fichier de manière à ce que seul un des changements apparaisse
  • Enregistrez le fichier (mais ne quittez pas l’éditeur)
  • Validez le fichier modifié en svn
  • Hit “annuler” dans l’éditeur suffisamment de fois pour que le deuxième ensemble de modifications réapparaisse
  • Enregistrez le fichier à nouveau
  • Validez le deuxième ensemble de modifications.

C’est une approche simpliste qui suppose qu’un ensemble de modifications est relativement facile à annuler. Pour des situations plus complexes, j’abandonnerais et commettrais les deux changements sans m’en soucier.

Maintenant que j’utilise git, j’espère que je ne le ferai plus jamais!

J’utilise soit un référentiel Darcs local, soit une fusion progressive des modifications. 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 

S’il y a plus d’un morceau non lié dans le fichier, rincez-le et répétez-le (mais pourquoi attendre si longtemps avant de le valider?!)

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

  1. Ouvrez tous les fichiers que vous souhaitez diviser en éditeur de choix
  2. En utilisant un ensemble d’outils différent (sous Win, utilisez la suggestion de Spike (l’ancienne version))
  3. Commettre
  4. retournez à votre éditeur de 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 avant tout, car certains éditeurs refuseront de sauvegarder un fichier qui a été modifié sous ces fichiers à moins que vous ne rechargiez ce fichier (en perdant toutes vos modifications).

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

entrer la description de l'image ici

Je pense qu’une option plus simple que la génération de fichiers diff, la restauration, etc., consisterait à extraire deux copies du référentiel, et à utiliser un outil de comparaison visuelle tel que DeltaWalker pour copier des pièces de l’un à l’autre.

Le premier exemplaire serait celui sur lequel vous travaillez, et le second ne serait que pour cela. Une fois que vous avez apporté une tonne de modifications au premier, vous pouvez copier une section sur la seconde, la valider, copier une autre section, la valider, etc.

  1. Copiez tous les fichiers modifiés concernés pour sauvegarder les copies.
  2. Créez un patch de l’état de travail en utilisant svn diff .
  3. Rétablir les fichiers en utilisant svn revert .
  4. Réappliquez les parties du correctif que vous souhaitez valider, soit en utilisant l’outil de patch , soit en le modifiant manuellement, etc.
  5. Exécutez diff après pour comparer votre copie de travail avec votre sauvegarde afin de vous assurer que vous avez correctement appliqué les parties de patch.
  6. Construire et tester
  7. Commettre.
  8. Copiez vos copies de sauvegarde dans votre extraction de référentiel.
  9. Répétez à 2. (pas à 1.!) Jusqu’à la fin.