Mientras programo el software almacenado en un repositorio de Subversion, a menudo modifico algunos archivos, luego me doy cuenta de que me gustaría hacer algún cambio preparatorio para mi trabajo principal. Por ejemplo, al implementar una nueva funcionalidad, noto algunas refactorizaciones que podrían ayudarme.
Para no mezclar dos cambios no relacionados, en estos casos me gustaría "guardar" mis cambios, es decir, volver a la versión del repositorio, hacer otros cambios, confirmarlos y luego "recuperar" mis cambios.
git-stash permite hacer exactamente eso. ¿Hay alguna manera de hacer esto con Subversion, ya sea directamente o con algún complemento o script? Los complementos de Eclipse también estarían bien.
svn
versioning
sleske
fuente
fuente
Respuestas:
Cuando tengo cambios no confirmados de una tarea en mi copia de trabajo y necesito cambiar a otra tarea, hago una de dos cosas:
Echa un vistazo a una nueva copia de trabajo para la segunda tarea.
o
Comience una rama:
Tengo algunos scripts que ayudan a automatizar esto.
fuente
project\temp\<creationdate-reason>
oproject\personal\<creationdate-reason>
para este propósito.Esta publicación de blog aconseja usar diff y patch.
git stash
aproximadamente se conviertesvn diff > patch_name.patch; svn revert -R .
git stash apply
se conviertepatch -p0 < patch_name.patch
Tenga en cuenta que esto no oculta los cambios de metadatos o (creo) que el directorio crea / elimina. (Sí, svn rastrea esos por separado del contenido del directorio, a diferencia de git).
fuente
svn patch patch_name.patch
lugar de hacerlopatch -p0
, porque están en el archivo de parche y svn patch los comprende.Puede almacenar sus cambios actuales
svn diff
en un archivo de parche y luego revertir su copia de trabajo:Después de implementar su función preparatoria, puede aplicar su parche con la utilidad de parche:
Como otros han señalado, esto no funcionará con
svn:properties
las operaciones en árbol (agregar, eliminar, renombrar archivos y directorios).Los archivos binarios también podrían dar problemas, no sé cómo parchear (o TortoiseSVN en este caso los maneja).
fuente
$ patch --strip=0 < stash.patch
esto asegurará que el parche no le pregunte el nombre del archivo cuando lo esté aplicando.La forma más fácil sería usar una rama temporal, como esta:
Esto podría (y probablemente debería) incluirse en un script si se realiza de forma más regular.
fuente
A partir de 1.10.0 (13/04/2018), tiene un
svn shelve
comando experimental . ( TortoiseSVN admite el comando ) No es más que un ayudante para guardar un parche y volver a aplicarlo, por lo que tiene las mismas limitaciones quesvn diff
+patch
(es decir, no puede manejar archivos binarios y renombrar). ( Editar : Parece que el soporte binario llegará en la próxima versión 1.11.0 )Editar ^ 2: con 1.11.0 (lanzado el 10-10-2018), se admiten archivos binarios . La archivación de archivos renombrados permaneció sin soporte. Las estanterías en 1.11 son incompatibles con las estanterías creadas por 1.10.
Editar ^ 3: con 1.12.0 (lanzado el 24/04/2019), se admite la copia y el cambio de nombre . Las estanterías en 1.12 son incompatibles con las estanterías creadas por versiones anteriores.
Editar ^ 4: No hay cambios en las estanterías con 1.13.0 y 1.14.0 . Los comandos todavía están marcados como experimentales y debe definirlos
SVN_EXPERIMENTAL_COMMANDS=shelf3
para habilitar la función. Parece que la función no está actualmente actualizada .Las notas de diseño se pueden encontrar en Wiki de desarrolladores .
fuente
No conozco una manera fácil de hacerlo con solo svn. Honestamente, recomendaría usarlo
git-svn
para hacer un repositorio git que actúe como una copia de trabajo svn, y solo usarlogit stash
con eso. Simplemente reemplacegit pull
congit svn rebase
ygit push
congit svn dcommit
y realmente puede mantener el 90% de su flujo de trabajo de git y seguir hablando con un servidor svn.fuente
Hay un pequeño script de Python 2 llamado
svn-stash
disponible bajo GPL 3: https://github.com/frankcortes/svn-stash .Funciona como las
svn diff/patch
soluciones mencionadas y ofrece empujar y hacer estallar los cambios como diferencias en algún directorio local. Desafortunadamente, los escondites no se pueden nombrar, y solo el último se puede reventar (bueno, sí, es una pila, pero no hay una razón real para tal limitación). Pero entonces, siempre puedes construir las características que faltan en el fuente.Está escrito para * ix, pero después de reemplazar cada "/"
os.sep
funciona muy bien en Windows también.Si usa svn 1.7 o superior, debe cambiar
is_a_current_stash()
: elimine la líneaif ".svn" in os.listdir(CURRENT_DIR):
, ya que solo hay un subdirectorio .svn de nivel superior en 1.7 WC.fuente
Puede hacerlo fácilmente usando Intellij IDEA - Cambios de estantería
fuente
metadata changes
ydirectory creates/deletes
? ¿Cómo exactamente quégit stash
hace?Otra opción es copiar su pago actual a un nuevo directorio y revertir todos sus cambios. de esta manera, ahorrará la molestia de crear una rama temporal en su servidor; después de todo, el ocultamiento es una operación local, que no todos deberían ver y que se puede hacer con bastante frecuencia.
después de confirmar su revisión, puede actualizar su copia de trabajo principal y eliminar su "área oculta"
fuente
También he querido esta característica. Actualmente uso TortoiseSVN.
No he encontrado una solución rápida, excepto para exportar el árbol, volver al repositorio, hacer mis cambios y confirmar, luego comparar los cambios del árbol exportado nuevamente en mi directorio controlado de origen usando una herramienta como Beyond Compare.
O, otra solución podría ser bifurcar desde HEAD a otro directorio, realizar sus cambios y confirmar. Una vez que esté listo para fusionarlos con su otra copia de trabajo, realice una actualización y combine sus cambios.
fuente
Siempre mantengo un segundo pago, al que llamo "trunk_clean". Cada vez que necesito hacer un cambio rápido y aislado relacionado con lo que estoy haciendo, solo me comprometo con ese pago.
fuente
Las ideas de ramificación y parcheo anteriores son geniales, pero no me funcionan bien. Utilizo una herramienta visual diff, por lo que ejecutar
git diff
no produce parches basados en texto. Nuestro sistema de compilación crea un nuevo entorno cada vez que se crea una rama, por lo que crear ramas temporales "ocultas" se volvería complicado.En cambio, escribí un pequeño script de shell que copia un archivo en un directorio "estante", agrega una marca de tiempo y revierte el cambio. No es tan robusto como las soluciones anteriores, pero también evita algunos de los escollos con los que me encontré.
fuente
Basado en la respuesta de Walter, he creado los siguientes alias en mi archivo bashrc:
Estos alias son mucho más fáciles de usar y recordar.
Uso:
svn.stash para guardar los cambios y svn.stash.apply para aplicar el almacenamiento.
fuente
En mi práctica, uso
git init
para crear un repositorio de Git en eltrunk
directorio de mi repositorio de Subversion, y luego agrego*.git
a los patrones de ignorar Succiones.Después de modificar algunos archivos, si deseo continuar mi trabajo con la línea principal de Subversion, solo uso
git stash
para esconder mi trabajo. Después de comprometerme con el repositorio de Subversion, usogit stash pop
para restaurar mis modificaciones.fuente
Utilizar:
Creará una rama desde la ubicación actual y la revisión actual, y luego confirmará los cambios en la copia de trabajo a esa rama sin cambiar a ella.
Tenga en cuenta que los cambios en la copia de trabajo no se revertirán automáticamente (
cp
es solo Copiar los cambios a una nueva rama) y debe revertirlos manualmente.Para restaurar los cambios, puede fusionar los cambios de la rama recién creada a su copia de trabajo.
--ignore-ancestry
se utiliza para no actualizar la información de fusión en la copia de trabajo.Utilizar:
para ver lo que tienes en el camino oculto. Las revisiones comprometidas también se imprimen.
Si ya no necesita el alijo, simplemente ejecute:
Esta solución es mejor que usar el parche, ya que si los nuevos cambios en la copia de trabajo o en la rama actual entran en conflicto con los cambios en el alijo, puede resolver los conflictos utilizando medios svn, mientras que
patch
en algunos casos simplemente fallará o incluso aplicará el parche incorrectamente.fuente
Dado que Subversion no admite la
stash
función perfectamente,solo lo hago de forma manual como esta.
Colocar
Development
yProduction(release)
proyectar en un camino separado.Puede trabajar cualquier característica nueva para su proyecto en la ruta de desarrollo,
y solo comprometería un progreso significativo o algo debería lanzarse para el establo.
Cuando tenga que lanzarlo para producción, abra el proyecto de producción, actualice svn y haga cosas para lanzar (compilar, exportar ... etc.).
Sé que esto es un poco problemático, pero la liberación del progreso no ocurre a menudo (no es para mí, pero sé que algunos proyectos sí) se comparan para desarrollar el progreso, de esta manera me queda bien.
Estoy usando svn para proyectos específicos ya que los miembros del equipo del proyecto lo usan, así que tengo que seguir.
La mejor solución es usar
git
un sistema de control de versiones perfecto y mejor quesvn
.fuente
dev
yprod
2 situaciones. Desarrollar una funcionalidad completamente nueva sería complicado con svn. No estoy seguro de si hay un método claro para resolver su caso en svn world.