Pregunta

He jugado un poco con CVS y no estoy muy familiarizado con todas sus capacidades, pero una gran molestia para mí es intentar agregar nuevos directorios que contengan más directorios.Correr "cvs add"solo agrega el contenido del directorio actual y usa"cvs import"tampoco parecía lo correcto ya que todavía es todo el código que estoy produciendo (este cómo importar la reclamación es para fuentes de terceros)

¿Conocen alguna forma de agregar recursivamente todo lo que hay en un directorio determinado al proyecto CVS actual (o si SVN o git lo hacen notablemente más fácil)?

¿Fue útil?

Solución

Ah, espacios.Esto funcionará con espacios:

find . -type f -print0| xargs -0 cvs add

Otros consejos

Descubrí que esto funcionó bastante efectivamente:

Primero, agregue todos los directorios, pero ninguno llamado "CVS":

find . -type d \! -name CVS -exec cvs add '{}' \;

Luego agregue todos los archivos, excluyendo cualquier cosa en un directorio CVS:

find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

Ahora bien, si alguien tiene una cura para la vergüenza de usar CVS hoy en día...

Yo uso esto:

Primero agregue recursivamente todos los directorios menos los CVS:

$> find . -type d \! -name CVS -exec cvs add '{}' \;

En segundo lugar, agregue todos los archivos, menos los directorios CVS:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

En tercer lugar, "comprometerse" de forma recursiva como el comentario de "primera versión":

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs commit -m "first version" '{}' \; \)

Último etiquetado de forma recursiva:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs tag -F MY_CVS_TAG '{}' \; \)

Primero agregue todos los directorios a CVS

find . -type d -print0| xargs -0 cvs add

Luego agregue todos los archivos en los directorios a CVS

find . -type f | grep -v CVS | xargs cvs add

Trabajó para mi

cvs import no es sólo para fuentes de terceros.De hecho, CVS no versiona los directorios, por lo que no están sujetos a las políticas de la sucursal.Siempre que importe directorios vacíos, está bien.

Tenga en cuenta que sólo puede utilizar cvs add en archivos y carpetas que se encuentran dentro de una copia de trabajo ya desprotegida; de lo contrario, obtendrá el "No se puede abrir CVS/Entradas para lectura" mensaje.Una técnica para crear un nuevo "módulo raíz" usando cvs add se explica en este artículo 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 confirmación opcional) de múltiples archivos en una sola operación.En WinCvs busque la macro Agregar>Agregar recursiva (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 para ellos (usados ​​principalmente para definir qué archivos son binarios).

Para obtener más información sobre la adición recursiva en WinCvs, consulte aquí: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive


Aparte de eso cvs import Es muy adecuado para adiciones masivas.Sin embargo, la manera cvs import se implementa en Vanilla CVS tiene dos inconvenientes (porque era escrito originalmente para código de terceros):

  • crea una rama obligatoria con semántica especial.
  • no crea los metadatos del repositorio (es decir,los directorios CVS ocultos) 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 sacarlos del repositorio

Si está utilizando CVSNT, puede evitar ambos inconvenientes especificando el -nC opción de importación. -n es para evitar la rama "proveedor" y -C es para crear los directorios CVS.

Esta respuesta de Mark fue útil (busque .-type f -print0 | XARGS -0 CVS AGREGAR) Pero resolví algún problema que ocurrió cuando los CV add intentan agregar sus propios archivos como etiqueta, entradas, etc.

  1. Agregue su carpeta de nivel más alto llamada NEW_FOLDER
cvs add NEW_FOLDER
  1. Utilice el comando anterior con alguna exclusión para agregar todo el árbol de subcarpetas

busque NEW_FOLDER/ -escriba d !-nombre "CVS" -y !-nombre "Etiqueta" -y !-nombre "Entradas.Registro" -y !-nombre "Entradas" -y !-nombre "Repositorio" -y !-name "root" -print0 | XARGS -0 CVS ADD

  1. Utilice el comando anterior con alguna exclusión para agregar todos los archivos

busque NEW_FOLDER/ -escriba f !-nombre "CVS" -y !-nombre "Etiqueta" -y !-nombre "Entradas.Registro" -y !-nombre "Entradas" -y !-nombre "Repositorio" -y !-name "root" -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 agregue todos los directorios a CVS

find . -type d -print0| xargs -0 cvs add

Luego agregue todos los archivos en los directorios a CVS

find . -type f -print0| xargs -0 cvs add

Estoy usando este sencillo script de shell, que debería iniciarse desde un directorio CVS ya retirado.Intentará estúpidamente 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 confirmación completo.

Simplemente guarda esto como algo como /usr/bin/cvsadd y no te olvides de 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"

Los métodos ya discutidos harán una búsqueda recursiva, pero fallará si realiza la misma acción nuevamente (si desea agregar subárbol al árbol existente) por esa razón debe verificar que sus directorios aún no se agregaran y luego agregue solo archivos que no agregado todavía.Para hacer eso usamos la salida de cvs up para ver qué elementos aún no se agregaron; tendrá un signo de interrogación al comienzo de la línea.

Usamos 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 es necesario 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 este tipo de 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

Me gusta hacer (ya que es necesario agregar un directorio)

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

La solución de Marcos. resuelve el problema de los espacios, pero produce este problema:

CV agregar:No se puede abrir CVS/entradas para leer:El fichero o directorio no existe
CVS [Agregar abortado]:sin repositorio

Para solucionarlo, el comando real a utilizar es:

find . -type f -exec cvs add {} \;

SVN definitivamente hace que esta tarea sea trivial; sin embargo, usar una GUI como Tortoise es aún más fácil.

Este podría ser un buen punto de partida: http://www-mrsrl.stanford.edu/~brian/cvstutorial/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top