suma - Cómo agregar directorios de CVS recursivamente
suma recursiva de n numeros (14)
Los métodos ya comentados harán búsquedas recursivas, pero fallarán si realiza la misma acción de nuevo (si desea agregar un subárbol al árbol existente) Por esa razón debe verificar que sus directorios no se hayan agregado todavía y luego agregar solo los archivos que no agregado aún Para hacer eso, utilizamos la salida de cvs up
para ver qué elementos no se agregaron aún: tendrá un signo de interrogación al inicio de la línea.
Usamos las opciones -0
, -print0
y -zZ
para asegurarnos de que procesamos correctamente los espacios en los nombres de archivos. También usamos --no-run-if-empty
para evitar ejecutar si no se necesita agregar nada.
CVS_PATTERN=/tmp/cvs_pattern
cvs -z3 -q up | egrep ''^/?.*'' | sed -e ''s/^? //'' > $CVS_PATTERN
find . -type d /! -name CVS -print0 | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
find . /( -type d -name CVS -prune /) -o /( -type f -print0 /) | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
cvs commit -m ''commiting tree recursively''
Con este enfoque evitaremos tales errores:
cvs add: cannot add special file `.''; skipping
cvs [add aborted]: there is a version in ./dirname1 already
y
cvs add: `./dirname2/filename'' already exists, with version number 1.1.1.1
He jugado un poco con CVS y no estoy muy familiarizado con todas sus capacidades, pero una gran molestia para mí es tratar de agregar nuevos directorios que contengan más directorios en ellos. Ejecutar " cvs add
" solo agrega el contenido del directorio actual y el uso de " cvs import
" tampoco parece ser lo correcto, ya que sigue siendo todo el código que estoy produciendo (este howto demandó que la importación es para fuentes de terceros )
¿Ustedes saben alguna forma de agregar recursivamente todo en un directorio determinado al proyecto actual de CVS (o si SVN o git lo hacen notablemente más fácil)?
Ah, espacios. Esto funcionará con espacios:
find . -type f -print0| xargs -0 cvs add
Creo que esto es lo que hice en mis días de CVS:
find . -type f | xargs cvs add
Primero agrega todos los directorios a CVS
find . -type d -print0| xargs -0 cvs add
A continuación, agregue todos los archivos en los directorios a CVS
find . -type f -print0| xargs -0 cvs add
cvs import
no es solo para fuentes de terceros. De hecho, CVS no versiona los directorios, por lo que no están sujetos a políticas de sucursales. Mientras importes directorios vacíos, está bien.
Tenga en cuenta que solo puede usar cvs add
en archivos y carpetas que se encuentran dentro de una copia de trabajo ya desprotegida; de lo contrario, aparecerá el mensaje "No se puede abrir CVS / Entries for reading" . Se explica una técnica para crear un nuevo "módulo raíz" usando cvs add
en este elemento de preguntas frecuentes de WinCVS: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule
Si está en Windows, tanto TortoiseCVS como WinCVS admiten la adición recursiva (y la confirmación opcional) de varios archivos en una sola operación. En WinCvs, busque la macro Agregar> Agregar recursivo (confirmación automática) ... En Tortoise, use el comando Agregar contenido en un directorio. Ambos le permitirán seleccionar qué archivos agregar y qué modos de expansión de palabras clave usar (principalmente para definir qué archivos son binarios).
Para obtener más información acerca de agregar recursivo en WinCvs, mira aquí: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive
Aparte de eso, la cvs import
es muy adecuada para adiciones masivas. Sin embargo, la forma en que se implementa la cvs import
en CVS vanilla tiene dos inconvenientes (porque originalmente se escribió para código de terceros):
- crea una rama obligatoria con semántica especial.
- no crea los metadatos del repositorio (es decir, los directorios ocultos de CVS) necesarios para establecer el código importado como una copia de trabajo desprotegida, lo que significa que para trabajar realmente con los archivos importados primero debe verificarlos fuera del repositorio
Si está utilizando CVSNT puede evitar ambos inconvenientes al especificar la opción -nC
en la importación. -n
es para evitar la rama "proveedor" y -C
es para crear los directorios CVS.
Estoy usando este sencillo script de shell, que debería iniciarse desde un directorio de CVS ya desprotegido. Estúpidamente intentará agregar / confirmar cualquier archivo y directorio que encuentre en su búsqueda recursiva, por lo que al final debería terminar con un árbol de commit completo.
Simplemente guarde esto como algo como /usr/bin/cvsadd
y no olvide chmod +x /usr/bin/cvsadd
.
#!/bin/sh # @(#) add files and directories recursively to the current CVS directory # (c) 2009 by Dirk Jagdmann if [ -z "$1" ] ; then echo "usage: cvsadd ''import message''" exit 1 fi if [ -d "$2" ] ; then cvs add "$2" cd "$2" || exit 1 fi if [ ! -d CVS ] ; then echo "current directory needs to contain a CVS/ directory" exit 1 fi XARGS="xargs -0 -r -t -L 1" # first add all files in current directory find . -maxdepth 1 -type f -print0 | $XARGS cvs add find . -maxdepth 1 -type f -print0 | $XARGS cvs ci -m "$1" # then add all directories find . -maxdepth 1 -type d -not -name CVS -a -not -name . -print0 | $XARGS "$0" "$1"
Encontré que esto funcionó bastante bien:
Primero, agregue todos los directorios, pero no cualquier nombre "CVS":
find . -type d /! -name CVS -exec cvs add ''{}'' /;
A continuación, agregue todos los archivos, excluyendo cualquier cosa en un directorio de CVS:
find . /( -type d -name CVS -prune /) -o /( -type f -exec cvs add ''{}'' /; /)
Ahora, si alguien tiene una cura para la vergüenza de usar CVS en este día y edad ...
me gusta hacer (ya que el directorio necesita un complemento)
cvs status 2>/dev/null | awk ''{if ($1=="?")system("cvs add "$2)}''
Es posible que deba ejecutar esto varias veces (primero para el directorio y luego para sus hijos) hasta que no haya salida
Yo uso esto:
Primero agregue recursivamente todos los directorios menos los de CVS:
$> find . -type d /! -name CVS -exec cvs add ''{}'' /;
En segundo lugar, agregue todos los archivos, menos los directorios de CVS:
find . /( -type d -name CVS -prune /) -o /( -type f -exec cvs add ''{}'' /; /)
Tercero haz un "commit" recursivo como "primera versión" de comentario:
find . /( -type d -name CVS -prune /) -o /( -type f -exec cvs commit -m "first version" ''{}'' /; /)
Último etiquetado todo recursivamente:
find . /( -type d -name CVS -prune /) -o /( -type f -exec cvs tag -F MY_CVS_TAG ''{}'' /; /)
Primero agrega todos los directorios a CVS
find . -type d -print0| xargs -0 cvs add
A continuación, agregue todos los archivos en los directorios a CVS
find . -type f | grep -v CVS | xargs cvs add
Trabajó para mi
SVN definitivamente hace esta tarea trivial, sin embargo, usar una GUI como Tortoise es aún más fácil.
Este podría ser un buen lugar para comenzar: http://www-mrsrl.stanford.edu/~brian/cvstutorial/
Esta respuesta de Mark fue útil (find. -type f -print0 | xargs -0 cvs add) pero resolví algunos problemas que ocurrieron cuando cvs add intentan agregar sus propios archivos como Tag, Entries, ect ..
- Agregue su carpeta de nivel más alto llamada NEW_FOLDER
cvs add NEW_FOLDER
- Utilice el comando anterior con alguna exclusión para agregar todas las sub-carpetas del árbol
encuentra NEW_FOLDER / -type d! -name "CVS" -y! -name "Tag" -y! -name "Entries.Log" -y! -name "Entradas" y! -name "Repositorio" -y! -name "Root" -print0 | xargs -0 cvs add
- Utilice el comando anterior con alguna exclusión para agregar todos los archivos
encuentra NEW_FOLDER / -type f! -name "CVS" -y! -name "Tag" -y! -name "Entries.Log" -y! -name "Entradas" y! -name "Repositorio" -y! -name "Root" -print0 | xargs -0 cvs add
La solución de Mark resuelve el problema de los espacios, pero produce este problema:
cvs add: no se puede abrir CVS / Entries para leer: No existe ningún archivo o directorio
cvs [agregar abortado]: sin repositorio
Para solucionarlo, el comando real para usar es:
find . -type f -exec cvs add {} /;