update tortoise svn command-line

update - tortoise svn



SVN: ¿Hay alguna manera de marcar un archivo como "no confirmar"? (17)

Subversion no tiene una función incorporada "do not commit" / "ignore on commit", a partir de febrero de 2016 / versión 1.9. Esta respuesta es una solución de línea de comandos no ideal

Como dice el OP, TortoiseSVN tiene una lista de cambios incorporada, "ignorar-en-comprometer", que se excluye automáticamente de las confirmaciones. El cliente de línea de comandos no tiene esto, por lo que debe usar múltiples listas de cambios para lograr este mismo comportamiento (con advertencias) :

  • uno para el trabajo que desea comprometer [trabajo]
  • uno para las cosas que quiere ignorar [ignore-on-commit]

Como hay un precedente con TortoiseSVN, uso "ignorar-en-comprometer" en mis ejemplos para los archivos que no quiero comprometer. Usaré "trabajo" para los archivos que hago, pero podrías elegir el nombre que quisieras.

Primero, agregue todos los archivos a una lista de cambios llamada "trabajo". Esto debe ejecutarse desde la raíz de su copia de trabajo:

svn cl work . -R

Esto agregará todos los archivos en la copia de trabajo recursivamente a la lista de cambios llamada "trabajo". Esto tiene una desventaja: a medida que se agregan nuevos archivos a la copia de trabajo, deberá agregar específicamente los nuevos archivos o no se incluirán. En segundo lugar, si tiene que ejecutar esto de nuevo, deberá volver a agregar todos sus archivos de "ignorar en el compromiso". No es ideal: podría comenzar a mantener su propia lista de "ignorar" en un archivo como lo han hecho otros.

Luego, para los archivos que desea excluir:

svn cl ignore-on-commit path/to/file-to-ignore

Debido a que los archivos solo pueden estar en una lista de cambios, ejecutar esta adición después de su "trabajo" anterior agregará eliminará el archivo que desea ignorar de la lista de cambios de "trabajo" y lo colocará en la lista de cambios "ignorar en el compromiso".

Cuando esté listo para enviar los archivos modificados que desea confirmar, simplemente deberá agregar "--cl work" a su confirmación:

svn commit --cl work -m "message"

Esto es lo que parece un simple ejemplo en mi máquina:

D:/workspace/trunk>svn cl work . -R Skipped ''.'' Skipped ''src'' Skipped ''src/conf'' A [work] src/conf/db.properties Skipped ''src/java'' Skipped ''src/java/com'' Skipped ''src/java/com/corp'' Skipped ''src/java/com/corp/sample'' A [work] src/java/com/corp/sample/Main.java Skipped ''src/java/com/corp/sample/controller'' A [work] src/java/com/corp/sample/controller/Controller.java Skipped ''src/java/com/corp/sample/model'' A [work] src/java/com/corp/sample/model/Model.java Skipped ''src/java/com/corp/sample/view'' A [work] src/java/com/corp/sample/view/View.java Skipped ''src/resource'' A [work] src/resource/icon.ico Skipped ''src/test'' D:/workspace/trunk>svn cl ignore-on-commit src/conf/db.properties D [work] src/conf/db.properties A [ignore-on-commit] src/conf/db.properties D:/workspace/trunk>svn status --- Changelist ''work'': src/java/com/corp/sample/Main.java src/java/com/corp/sample/controller/Controller.java src/java/com/corp/sample/model/Model.java M src/java/com/corp/sample/view/View.java src/resource/icon.ico --- Changelist ''ignore-on-commit'': M src/conf/db.properties D:/workspace/trunk>svn commit --cl work -m "fixed refresh issue" Sending src/java/com/corp/sample/view/View.java Transmitting file data .done Committing transaction... Committed revision 9.

Una alternativa sería simplemente agregar cada archivo que desea comprometer a una lista de cambios de "trabajo", y ni siquiera mantener una lista de ignorar, pero esto también es mucho trabajo. Realmente, la única solución simple e ideal es si / cuando esto se implementa en SVN. Hay un problema de larga data sobre esto en el rastreador de problemas de Subversion, SVN-2858 , en caso de que esto cambie en el futuro.

Con TortoiseSVN, puedo mover un archivo a la lista de cambios de ignorar en la confirmación, de modo que cuando confirme un árbol completo, los cambios en ese archivo no se comprometan.

¿Hay alguna manera de hacer algo así usando la herramienta de línea de comandos svn?

EDITAR: Gracias por las sugerencias para usar svn:ignore , pero eso no hace exactamente lo que estaba buscando.

svn:ignore afecta a cosas como svn add y svn import . Le da una lista de patrones de nombre de archivo para ignorar.

Tengo un archivo que ya está bajo el control de fuente, pero quiero hacer cambios temporales en ese archivo que no quiero que se comprometa más tarde cuando confirme todo el árbol de fuentes. Estoy haciendo muchos otros cambios y podría colocar una nota en mi monitor diciéndome que revierte ese archivo antes de comprometer el árbol, pero sería bueno que svn saltara automáticamente ese archivo.


Actualización de la secuencia de comandos de user88044.

La idea es insertar los archivos en la lista de cambios do-not-commit y ejecutar el script malvado.

El script extrae los archivos do-not-commit del comando: svn status --changelist ''do-not-commit''

#! / bin / bash DIR = "$ (pwd)"

IGNORE_FILES = "$ (estado svn --changelist ''do-not-commit'' | tail -n +3 | grep -oE ''[^] + $'')"

para mí en $ IGNORE_FILES; do mv $ DIR / $ i $ DIR / "$ i" _; hecho;

svn "$ @";

para mí en $ IGNORE_FILES; do mv $ DIR / "$ i" _ $ DIR / $ i; hecho;

El script se coloca en / usr / bin / svnn (sudo chmod + x / usr / bin / svnn)

estado svnn, svnn commit, etc ...


Algunas de las ideas propuestas pueden implementarse así:

En Windows en PowerShell

agregar todo a la lista predeterminada.ps1

dir -Recurse | ? { -not $_.PSIsContainer } | % { svn cl default $_.FullName }

agregar a ignorar list.ps1

dir file1 ... filN % { $_.FullName } > ignore-on-commit cat ./ignore-on-commit | % { svn cl ignore-on-commit $_ } svn add ignore-on-commit

Ahora, puede alias svn ci --changelist default para que no tenga que especificarlo cada vez. El beneficio adicional es que puede almacenar la lista de ignorar en la confirmación (si lo desea) en el repositorio.

Lo hago para algunos archivos que se regeneran constantemente, pero que rara vez cambian a mano. Por ejemplo, agrego el número de revisión a mis archivos de configuración en marcadores de posición específicos para que los archivos se cambien en cada confirmación, aunque el cambio manual es raro.


Chicos Acabo de encontrar una solución. Dado que TortoiseSVN funciona como queremos, intenté instalarlo en Linux, lo que significa que se ejecuta en Wine. Sorprendentemente funciona! Todo lo que tienes que hacer es:

  1. Agregue los archivos que desea omitir commit ejecutando: "svn changelist ''ignore-on-commit''".
  2. Use TortoiseSVN para confirmar: "~ / .wine / drive_c / Program / Files / TortoiseSVN / bin / TortoiseProc.exe / command: commit / path: ''
  3. Los archivos excluidos estarán desmarcados para la confirmación por defecto, mientras que otros archivos modificados se verificarán. Esto es exactamente lo mismo que en Windows. ¡Disfrutar!

(La razón por la cual es necesario excluir archivos por CLI es porque no se encontró la entrada del menú para hacer eso, no estoy seguro de por qué. De cualquier forma, ¡esto funciona muy bien!)


Como yo estaba enfrentando exactamente el mismo problema, y ​​mi búsqueda en Google no me daba nada, creo que encontré una solución. Esto es lo que hice, parece funcionar para mí, pero como estoy atascado con una versión anterior de SVN (<1.5, ya que no tiene la opción --keep-local) y no soy un experto en eso No puedo estar seguro de que sea una solución universal. Si a usted también le funciona, ¡por favor hágamelo saber!

Estaba lidiando con una instalación de Prestashop que obtuve de SVN, ya que otras personas ya habían empezado a trabajar en ella. Dado que la configuración de la base de datos se realizó para otro servidor, los cambié en algún archivo de la carpeta / config. Como esta carpeta ya estaba versionada, configurarla en svn: ignorar no evitaría que se cometieran mis modificaciones locales. Esto es lo que hice:

cp config ../cfg_bkp # copy the files out of the repo svn rm config # delete files both from svn and "physically" svn propset svn:ignore "config" . # as the files no longer exists, I can add my ignore rule and then... mv ../cfg_bkp config # ...bring''em back svn revert --recursive config # make svn forget any existing status for the files (they won''t be up for deletion anymore)

Ahora puedo ejecutar svn add --force. en la raíz del repositorio sin agregar mi configuración, incluso si no coincide con la versión del repositorio (supongo que tendría que volver a pasar por todo esto si lo modifiqué una vez más, no lo hice). También puedo actualizarme sin tener que sobreescribir mis archivos ni recibir ningún error.


Consulte las changelists , que le pueden proporcionar una opción para filtrar los archivos que ha modificado pero que no desea comprometer. SVN no omitirá automáticamente un archivo a menos que se lo indique, y la forma en que le dice que este archivo es de alguna manera diferente a otros archivos es ponerlo en una lista de cambios.

Requiere más trabajo para usted, y solo puede aplicar la lista de cambios a su copia de trabajo (obviamente, imagine el caos que podría surgir si pudiera aplicar una propiedad ''nunca actualizar'' a una revisión).


En su lugar, escribiría un guión bash de ayuda que ejecute svn commit en todos los archivos que necesita y ninguno de los que no. De esta manera tienes mucho más control.

Por ejemplo, con una línea, puede enviar todos los archivos con extensión .h y .cpp a los que realizó cambios (y que no causarían un conflicto):

svn commit -m "" `svn status | grep "^M.*[h|cpp]$" | awk ''{print $2}'' | tr "//n" " "`

Cambiar / agregar extensiones a la parte [h|cpp] . Agregue un mensaje de registro entre las comillas de -m "" si es necesario.


Esto es tarde para el juego, pero encontré el comando de línea de comando más impresionante para este problema. Hecho usando bash. Disfrutar.

svn status | grep -v excluding | sed ''s/^A */"/g; s/$/"/g'' | tr ''/n'' '' '' | xargs svn commit -m "My Message"

Ok, entonces aquí hay una explicación del comando. Algunas cosas deberán cambiarse según su caso de uso.

svn status

Obtengo una lista de todos los archivos. Todos comenzarán con esos caracteres de estado (?,!, A, etc.). Cada uno está en sus propias líneas

grep -v excluding

Yo uso grep para filtrar la lista. Puede usarse normalmente (para incluir) o con el distintivo -v (para excluir). En este caso, se está utilizando para excluir, con una frase "excluyendo" siendo lo que se excluirá.

sed ''s/^. */"/g; s/$/"/g''

Ahora elimino el carácter de estado y el espacio en blanco al comienzo de cada línea, y luego cito cada línea, usando sed. Algunos de mis nombres de archivos tienen espacios en ellos, de ahí las citas.

tr ''/n'' '' ''

Utilizando tr, reemplazo todas las líneas nuevas por espacios. Ahora toda mi lista de archivos para confirmar está en una línea.

xargs svn commit -m "My Message"

Por último, uso xargs para ejecutar mi comando de confirmación con el mensaje. Realiza la confirmación y descarta mi lista de archivos citada como último argumento.

El resultado es que finalmente todo funciona como yo quiero. Sigo odiando a svn por obligarme a saltar a través de estos malditos aros, pero puedo vivir con esto. Supongo.


Llegué a este hilo en busca de una manera de hacer una confirmación "atómica" de solo algunos archivos y en lugar de ignorar algunos archivos en el compromiso, hice el resto y solo envié los archivos que quería:

svn ci filename1 filename2

Tal vez, ayudará a alguien.


Los archivos en conflicto no pueden ser comprometidos. Puede aprovechar esto para mantener sus cambios privados fuera del repositorio. Esto funciona mejor con una pequeña cantidad de archivos.

Para obtener un conflicto para a-file , su copia de trabajo (WC) no tiene el a-file a actualizado desde el repositorio, y que el a-file en su WC tiene cambios que están en la misma ubicación que los cambios en el a-file repositorio (cambios a los que no se actualizó aún). Si no desea esperar las condiciones anteriores, puede crear un conflicto para a-file como este:
En la copia de trabajo 1 (WC1), agregue una línea de texto en la parte superior de a-file , como "crear un conflicto aquí" . Use la sintaxis necesaria para no romper el repositorio. Confirmar a-file desde WC1. En WC2, agregue una línea de texto diferente a la parte superior de a-file , como "quiero un conflicto" . Actualice desde WC2, y ahora un archivo debe estar en conflicto.


Me cansé de esperar a que esto se incorpore a SVN. Estaba usando tortuga SVN con ignorar-en-comprometer, pero aparece un cuadro de diálogo de usuario que no se puede suprimir desde la línea de comandos, y cuando ejecuto mi script de compilación y voy a hacer una taza de té, lo odio cuando Vuelvo a descubrir que está esperando la entrada del usuario en un 10% del camino.

Así que aquí hay una secuencia de comandos de Windows powershell que solo confirma los archivos que no están en una lista de cambios:

# get list of changed files into targets [XML]$svnStatus = svn st -q --xml C:/SourceCode/Monad # select the nodes that aren''t in a changelist $fileList = $svnStatus.SelectNodes(''/status/target/entry[wc-status/@item != "unversioned"]'') | Foreach-Object {$_.path}; # create a temp file of targets $fileListPath = [IO.Path]::GetTempFileName(); $fileList | out-file $fileListPath -Encoding ASCII # do the commit svn commit --targets $fileListPath -m "Publish $version" --keep-changelists # remove the temp file Remove-Item $filelistPath


No creo que haya una manera de ignorar un archivo en el repositorio. A menudo nos encontramos con esto con web.config y otros archivos de configuración.

Aunque no es perfecto, la solución que más a menudo veo y uso es tener un archivo .default y una tarea nant para crear copias locales.

Por ejemplo, en el repositorio hay un archivo llamado web.config.default que tiene valores predeterminados. A continuación, cree una tarea nant que cambie el nombre de todos los archivos web.config a web.config que luego se pueden personalizar con valores locales. Esta tarea debe invocarse cuando se recupera una nueva copia de trabajo o se ejecuta una compilación.

También deberá ignorar el archivo web.config que se creó para que no esté comprometido con el repositorio.


Puede configurar la lista de cambios "ignorar-en-comprometer" directamente con TortoiseSVN. No es necesario configurar ninguna otra lista de cambios, incluidos todos los demás archivos

1) Haga clic en "SVN Commit ..." (no nos comprometeremos, solo una forma de encontrar un menú gráfico para la lista de cambios) 2) En la lista, haga clic con el botón derecho en el archivo que desea excluir. 3) Menú: mover a lista de cambios> ignorar-en-comprometer

La próxima vez que haga un commit de SVN ... Los archivos aparecerán sin marcar al final de la lista, en la categoría ignore-on-commit.

Probado con: TortoiseSVN 1.8.7, Build 25475 - 64 Bit, 2014/05/05 20:52:12, Subversion 1.8.9, -release


Siempre me he encontrado en esta situación: las listas de cambios no me funcionan, quiero hacer una lista breve de los archivos que no quiero comprometer, en lugar de mantener una lista masiva de archivos que quiero ¡comprometerse!

Trabajo en la línea de comandos de Linux: así que mi solución es crear un script / usr / bin / svnn (¡sí, con dos ''n''s!) De la siguiente manera:

#! /bin/bash DIR=/home/mike/dev/trunk IGNORE_FILES="/ foo/pom.xml / foo/src/gwt/App.gwt.xml / foo/src/main/java/gwt/Common.gwt.xml / foo/src/main/resources/context/datasource/local.xml / foo/src/main/resources/context/environment/local.xml" for i in $IGNORE_FILES; do mv $DIR/$i $DIR/"$i"_; done; svn "$@" for i in $IGNORE_FILES; do mv $DIR/"$i"_ $DIR/$i; done;

Obviamente, esto se adapta a mi situación, pero simplemente cambie DIR y IGNORE_FILES para adaptarlo a su configuración de desarrollo. Recuerda cambiar la secuencia de comandos a ejecutable con:

sudo chmod +x /usr/bin/svnn

..entonces simplemente usa "svnn" en lugar de "svn" para ejecutar subversion sin temor a verificar los cambios locales a los archivos en la lista IGNORE_FILES. ¡Espero que esto ayude!



Una solución que no ignora los cambios en las propiedades del directorio

Traté de usar la solución basada en la lista de changelist , pero tengo un par de problemas con ella. En primer lugar, mi repositorio tiene miles de archivos, por lo que la lista de cambios que se debe comprometer es enorme, y mi salida de svn status llegó a ser demasiado larga y necesitaba ser analizada para ser útil. Lo más importante es que quería confirmar los cambios que surgieron de una fusión, lo que significa que incluyen cambios de propiedad. Al comprometer una lista de cambios, las propiedades de svn adjuntas al directorio no están confirmadas, así que tuve que hacer una confirmación adicional:

svn ci --cl work -m "this commits files from the work changelist only" svn up svn ci --depth empty DIR . -m "record merge properties"

Puede que tenga que hacer eso para varios directorios (aquí grabo las propiedades de DIR y del directorio actual), básicamente aquellos con una M en la segunda columna al emitir el comando svn status .

Solución

svn patch parches y svn patch . En pseudo-código:

svn diff $IGNORE_FILES > MYPATCH # get the mods to ignore svn patch --reverse-diff MYPATCH # remove the mods svn ci -m "message" # check-in files and directory properties svn patch MYPATCH # re-apply the mods

Al igual que otros carteles, termino usando una secuencia de comandos para mantener la lista de archivos para ignorar:

#! /usr/bin/env bash finish() { svn patch MYPATCH # re-apply the mods } trap finish EXIT IGNORE_FILES="/ sources/platform/ecmwf-cca-intel-mpi.xml / runtime/classic/platform/ecmwf-cca.job.tmpl / runtime/classic/platform/ecmwf-cca-intel.xml" svn diff $IGNORE_FILES > MYPATCH # get the mods to ignore svn patch --reverse-diff MYPATCH # remove the mods svn "$@"

Lo usé típicamente con ci y revert -R . .


svn propset "svn:ignore" "*.xml" .

el *.xml es el patrón de archivos para ignorar; también puede usar nombres de directorio aquí.