Lors de la programmation d'un logiciel stocké dans un dépôt Subversion, je modifie souvent certains fichiers, puis je remarque que j'aimerais effectuer des changements préparatoires pour mon travail principal. Par exemple, lors de la mise en œuvre de nouvelles fonctionnalités, je remarque une refactorisation qui pourrait m'aider.
Afin de ne pas mélanger deux modifications non liées, dans ces cas, je voudrais "ranger" mes modifications, c'est-à-dire revenir à la version du référentiel, effectuer d'autres modifications, les valider, puis "récupérer" mes modifications.
git-stash permet de faire exactement cela. Existe-t-il un moyen de le faire avec Subversion, soit directement, soit avec un plugin ou un script. Les plugins Eclipse seraient également très bien.
la source
Réponses:
Lorsque j'ai des modifications non validées d'une tâche dans ma copie de travail et que je dois passer à une autre tâche, je fais l'une des deux choses suivantes:
Découvrez une nouvelle copie de travail pour la deuxième tâche.
ou
Démarrer une succursale:
J'ai quelques scripts qui aident à automatiser cela.
la source
project\temp\<creationdate-reason>
ouproject\personal\<creationdate-reason>
à cette fin.Ce billet de blog conseille d'utiliser diff et patch.
git stash
devient approximativementsvn diff > patch_name.patch; svn revert -R .
git stash apply
devientpatch -p0 < patch_name.patch
Notez que cela ne cache pas les modifications de métadonnées ou (je pense) que le répertoire crée / supprime. (Oui, svn suit ceux-ci séparément du contenu du répertoire, contrairement à git.)
la source
svn patch patch_name.patch
place depatch -p0
, car elles sont dans le fichier de correctif, et svn patch les comprend.Vous pouvez stocker vos modifications actuelles
svn diff
dans un fichier correctif, puis restaurer votre copie de travail:Après avoir implémenté votre fonction préparatoire, vous pouvez ensuite appliquer votre patch avec l'utilitaire de patch:
Comme d'autres l'ont noté, cela ne fonctionnera pas avec
svn:properties
les opérations d'arborescence (ajouter, supprimer, renommer des fichiers et des répertoires).Les fichiers binaires peuvent également poser des problèmes, je ne sais pas comment le patch (ou TortoiseSVN dans ce cas les gère).
la source
$ patch --strip=0 < stash.patch
cela garantira que le patch ne vous demandera pas le nom du fichier lorsque vous appliquez votre patch.La façon la plus simple serait d'utiliser une branche temporaire, comme ceci:
Cela pourrait (et devrait probablement) être mis dans un script si cela était fait plus régulièrement.
la source
Depuis la 1.10.0 (13/04/2018), vous disposez d'une
svn shelve
commande expérimentale . ( TortoiseSVN prend en charge la commande ) Ce n'est rien d'autre qu'une aide pour enregistrer un patch et le réappliquer, il a donc les mêmes limitations quesvn diff
+patch
(c'est-à-dire qu'il ne peut pas gérer les fichiers binaires et les renommer). ( Edit : On dirait que le support binaire arrivera à la prochaine version 1.11.0 )Modifier ^ 2: Avec 1.11.0 (publié le 2018-10-30), les fichiers binaires sont pris en charge . Le stockage des fichiers renommés n'est pas pris en charge. Les étagères en 1.11 sont incompatibles avec les étagères créées par 1.10.
Modifier ^ 3: avec 1.12.0 (publié le 2019-04-24), la copie et le changement de nom sont pris en charge . Les étagères en 1.12 sont incompatibles avec les étagères créées par les versions antérieures.
Edit ^ 4: Il n'y a aucun changement autour des rayonnages avec 1.13.0 et 1.14.0 . Les commandes sont toujours marquées comme expérimentales et vous devez définir
SVN_EXPERIMENTAL_COMMANDS=shelf3
pour activer la fonctionnalité. Il semble que la fonctionnalité ne soit pas actuellement testée .Les notes de conception peuvent être trouvées sur le wiki des développeurs .
la source
Je ne connais pas de moyen facile de le faire avec juste svn. Honnêtement, je vous conseille d'utiliser
git-svn
pour faire un dépôt git qui agit comme une copie de travail svn, et de simplement l'utilisergit stash
avec cela. Remplacez simplementgit pull
pargit svn rebase
etgit push
pargit svn dcommit
et vous pouvez réellement conserver 90% de votre flux de travail git et toujours parler à un serveur svn.la source
Il existe un petit script Python 2 appelé
svn-stash
disponible sous GPL 3: https://github.com/frankcortes/svn-stash .Il fonctionne comme les
svn diff/patch
solutions mentionnées et offre des poussées et des sauts de modifications sous forme de différences dans un répertoire local. Malheureusement, les stashes ne peuvent pas être nommés, et seul le dernier peut être sauté (enfin, oui, c'est une pile, mais il n'y a pas vraiment de raison pour une telle limitation.) Mais alors, vous pouvez toujours intégrer les fonctionnalités manquantes dans le la source.Il est écrit pour * ix, mais après avoir remplacé chaque "/",
os.sep
il fonctionne aussi bien sous Windows.Si vous utilisez svn 1.7 ou supérieur, vous devez changer
is_a_current_stash()
: supprimez la ligneif ".svn" in os.listdir(CURRENT_DIR):
, car il n'y a qu'un seul sous-répertoire .svn de niveau supérieur dans 1.7 WC.la source
Vous pouvez le faire facilement en utilisant Intellij IDEA - Shelve Changes
la source
metadata changes
etdirectory creates/deletes
? Comme quoi exactementgit stash
?une autre option consiste à copier votre paiement actuel dans un nouveau répertoire et à annuler toutes vos modifications. De cette façon, vous éviterez les tracas de la création d'une branche temporaire sur votre serveur - après tout, le stashing est une opération locale, que tout le monde ne devrait pas voir et qui peut être effectuée assez souvent.
après avoir validé votre correctif, vous pouvez mettre à jour votre copie de travail principale et supprimer votre «zone de stockage»
la source
J'ai également voulu cette fonctionnalité. J'utilise actuellement TortoiseSVN.
Je n'ai pas trouvé de solution fiable, sauf pour exporter l'arborescence, revenir au référentiel, apporter mes modifications et valider, puis comparer les modifications de l'arborescence exportée dans mon répertoire contrôlé par la source à l'aide d'un outil comme Beyond Compare.
Ou, une autre solution pourrait être de passer de la tête à un autre répertoire, d'apporter vos modifications et la validation. Une fois que vous êtes prêt à les fusionner dans votre autre copie de travail, effectuez une mise à jour et fusionnez vos modifications.
la source
Je garde toujours un deuxième paiement, que j'appelle "trunk_clean". Chaque fois que j'ai besoin de faire un changement rapide et isolé lié à ce que je fais, je m'engage à la place.
la source
Les idées de branchement et de correction ci-dessus sont excellentes, mais elles ne fonctionnent pas bien pour moi. J'utilise un outil de diff visuel, donc l'exécution
git diff
ne produit pas de correctifs basés sur du texte. Notre système de construction crée un nouvel environnement chaque fois qu'une branche est créée, donc créer des branches "cachées" temporaires deviendrait compliqué.Au lieu de cela, j'ai écrit un petit script shell qui copie un fichier dans un répertoire "étagère", ajoute un horodatage et annule la modification. Ce n'est pas aussi robuste que les solutions ci-dessus, mais cela évite également certains des pièges que j'ai rencontrés.
la source
Sur la base de la réponse de Walter, j'ai créé les alias suivants dans mon fichier bashrc:
Ces alias sont beaucoup plus faciles à utiliser et à mémoriser.
Usage:
svn.stash pour cacher les modifications et svn.stash.apply pour appliquer la cachette.
la source
Dans ma pratique, j'utilise
git init
pour créer un référentiel Git dans letrunk
répertoire de mon référentiel Subversion, puis j'ajoute*.git
aux motifs ignorer Suctions.Après avoir modifié certains fichiers, si je veux continuer mon travail avec la ligne principale de Subversion, je l'utilise juste
git stash
pour ranger mon travail. Après m'être engagé dans le référentiel Subversion, je l'utilisegit stash pop
pour restaurer mes modifications.la source
Utilisation:
Il créera une branche à partir de l'emplacement actuel et de la révision actuelle, puis il validera les modifications de la copie de travail dans cette branche sans y basculer.
Notez que les modifications dans la copie de travail ne seront pas automatiquement annulées (il
cp
s'agit simplement de modifications CoPying dans une nouvelle branche) et vous devez les annuler manuellement.Pour restaurer les modifications, vous pouvez simplement fusionner les modifications de la branche nouvellement créée avec votre copie de travail.
--ignore-ancestry
est utilisé afin de ne pas mettre à jour les informations de fusion dans la copie de travail.Utilisation:
pour voir ce que vous avez sur le chemin caché. Les révisions engagées sont également imprimées.
Si vous n'avez plus besoin de la cachette, lancez simplement:
Cette solution est meilleure que d'utiliser le correctif, car si de nouveaux changements dans la copie de travail ou sur la branche actuelle entrent en conflit avec les changements dans la cachette, vous pouvez résoudre les conflits en utilisant les moyens svn, alors que
patch
dans certains cas, ils échoueront ou même appliqueront le correctif de manière incorrecte.la source
Étant donné que Subversion ne prend pas
stash
parfaitement en charge la fonctionnalité,je fais simplement une méthode manuelle comme celle-ci.
Placer
Development
etProduction(release)
projeter sur un chemin séparé.Vous pouvez travailler toutes les nouvelles fonctionnalités de votre projet dans le chemin de développement,
et vous ne feriez que des progrès significatifs ou quelque chose devrait être publié pour l'écurie.
Lorsque vous devez le publier pour la production, ouvrez le projet de production, mettez à jour svn et faites des choses à publier (génération, exportation, etc.).
Je sais que cela rend un peu gênant, mais publier des progrès ne se produit pas souvent (ce n'est pas le cas pour moi, mais je sais que certains projets le font) comparer pour développer des progrès, de cette façon me convient.
J'utilise svn pour des projets spécifiques depuis que les membres de l'équipe de projet l'utilisent, donc je dois suivre.
La meilleure solution est d'utiliser
git
un système de contrôle de version parfait et meilleur quesvn
.la source
dev
que deprod
2 situations. Développer des fonctionnalités complètement nouvelles serait compliqué avec svn. Je ne sais pas s'il existe une méthode claire pour résoudre votre cas dans svn world.