Pregunta

Soy nuevo en SVN, así que esta podría ser una pregunta fácil.

Tenemos un '' tronco '' con directorios de primer nivel:

10 <-- documents
20 <-- source code, db scripts, ...
30 <-- documents
40 <-- referenced 3rd party library-es

Hice un " desarrollar " rama del '' tronco ''. En " desarrollar " cambiamos nuestro código fuente y después de probarlo lo fusionamos con '' tronco ''.

El problema en eso en los directorios " 10 " y "30" se almacenan archivos * .doc que no son necesarios para el desarrollo, por lo que se REQUIERE que " desarrolle " la sucursal no tiene esos directorios.

La solución aún debería:

  1. permitir " svn update " en la carpeta raíz de " desarrollar " copia de trabajo, (20 y 40)
  2. que la actualización no debe volver a crear directorios 10 y 30 y
  3. por supuesto, fusionando " desarrollar " a "tronco" NO debe eliminar 10 o 30 en " trunk " ;.

EDITAR: Olvidé mencionar que el "código fuente" no está solo en 20. Hay referencias dll-s y scripts de compilación, etc., que también están en el directorio de primer nivel, digamos 40.

¿Fue útil?

Solución

Si leo su pregunta correctamente, se trata simplemente de usar svn copy para copiar solo los directorios deseados en una rama; básicamente, una combinación de respuestas de Mike Kushner y Ivan Krechetov . Sin embargo, creo que puede ser más fácil de entender después de seguir los pasos usted mismo, por lo que el resto de esta publicación creará un repositorio de muestra y mostrará las copias y las fusiones.

Voy a suponer que estás usando el " estándar " Diseño del repositorio, que en el nivel superior tiene tres subdirectorios, troncal , ramas y etiquetas . Y que sus directorios 10 , 20 , 30 y 40 están debajo del tronco. En otras palabras:

trunk
    10
    20
    30
    40
branches
tags

Y, como señaló Mike, su objetivo será tener una estructura que se vea así:

trunk
    10
    20
    30
    40
branches
    sandbox
        20
        40
tags

No está claro a partir de su publicación (al menos a partir de la edición actual), pero puede tener una estructura de directorio en la que 10 , 20 , y otros están en El nivel superior. En este caso, deberá crear un nuevo directorio de nivel superior, al que llamaré dev , para que su repositorio general tenga el siguiente aspecto:

10
20
30
40
dev
    20
    40

Tenga en cuenta que no puede crear dev en 20 . Bueno, físicamente puedes, pero es casi seguro que romperás tu construcción al hacerlo.

Bien, veamos un ejemplo en el que creamos un nuevo repositorio y colocamos algunos archivos en él. Debe poder ejecutar el comando svnadmin (que debería poder hacer, a menos que tenga un administrador de sistemas paranoico). Elija un directorio temporal y ejecute los siguientes comandos (estoy ejecutando Linux; si está ejecutando Windows, los comandos serán los mismos, pero deberá colocar una ruta específica de Windows en la variable REPO):

svnadmin create temp.repo
REPO="file://`pwd`/temp.repo"
svn co $REPO temp

Esto crea un nuevo repositorio (vacío) y extrae una copia de trabajo del mismo. La segunda línea necesita alguna explicación: simplemente crea la URL del repositorio desde el directorio actual. En mi directorio de espacio de trabajo, la URL se ve así:

file:///home/kgregory/Workspace/temp.repo

OK, ahora que tiene una copia de trabajo, creemos la estructura de directorios de muestra y algunos archivos:

cd temp
svn mkdir trunk
svn mkdir branches
svn mkdir tags
svn commit -m "standard repo structure"

pushd trunk
svn mkdir 10
svn mkdir 20
svn mkdir 30
svn mkdir 40
svn commit -m "example sub-project structure"

echo "this doesn't change" > 10/dontchange.txt
svn add 10/dontchange.txt
echo "this does change" > 20/change.txt
svn add 20/change.txt
svn status
svn commit -m "example files"
popd

En este punto tenemos los directorios de muestra y dos archivos en ellos. Aquí está la salida de find , excluyendo los directorios ocultos de subversion:

temp, 531> find . | grep -v svn
.
./tags
./trunk
./trunk/10
./trunk/10/dontchange.txt
./trunk/30
./trunk/20
./trunk/20/change.txt
./trunk/40
./branches

El siguiente paso es crear el directorio sandbox y hacer copias de los dos directorios que estarán en él:

svn mkdir branches/sandbox
pushd branches/sandbox
svn copy ${REPO}/trunk/20 .
svn copy ${REPO}/trunk/40 .
svn commit -m "make development branch"
popd

Esta es la parte importante: creo la rama y las copias en mi directorio de trabajo, como una copia del repositorio. Normalmente, simplemente copie trunk en un elemento secundario de ramas , usando svn copy con dos argumentos de repositorio. Eso no funciona aquí, porque solo queremos dos hijos de trunk .

Después de hacer esto, mi copia de trabajo se ve así:

temp, 539> find . | grep -v svn
.
./tags
./trunk
./trunk/10
./trunk/10/dontchange.txt
./trunk/30
./trunk/20
./trunk/20/change.txt
./trunk/40
./branches
./branches/sandbox
./branches/sandbox/20
./branches/sandbox/20/change.txt
./branches/sandbox/40

En este punto, normalmente verificaría la rama de desarrollo en un nuevo directorio de trabajo y trabajaría allí. Así que haré eso (después de un cd de vuelta a mi directorio de Workspace):

svn co ${REPO}/branches/sandbox sandbox
cd sandbox

Y ahora haga algunos cambios:

vi 20/change.txt
svn commit -m "changed on branch"

Bien, ahora es el momento de volver a fusionarse con el tronco. Regrese al espacio de trabajo y vea solo el tronco:

svn co ${REPO}/trunk trunk
cd trunk

Y fusionarse desde el sandbox. El proceso de fusión se describe en Documentos de Subversion :

svn merge -r 4:5 ${REPO}/branches/sandbox
svn status

Ese último comando debería mostrarle que solo el archivo 20 / change.txt se vio afectado por la fusión. Como no copió los 10 o 30 directorios en la rama, la fusión no los tocará.

Otros consejos

Lo que quieres hacer es crear una copia de " 20 " en algún lugar de su árbol svn, con el que puede fusionarse de un lado a otro. Una estructura común es

repo
---> trunk
    ---> 10 
    ---> 20
    ---> 30
---> branches
    ---> sandboxes
        ---> develop <branch of 20>
---> tags

Cuando desee actualizar "desarrollar", puede crear una nueva rama de "20" debajo de cajas de arena o realizar una fusión de 20 para desarrollar. Cuando desee los cambios en " desarrollar " De vuelta en su baúl, se funde en la otra dirección. Sus desarrolladores deben consultar una copia de "desarrollar" (o crear sus propias ramas basadas en " desarrollar ")

afaik no puedes hacerlo con la estructura de repositorio que tienes actualmente.

Le sugiero que reestructure su repositorio, entonces 10 & amp; 20, 40 y amperios; los otros activos relacionados con el código se mueven a una nueva carpeta de primer nivel. De esta forma, evita esta situación y simplifica la posibilidad de obtener solo los activos relacionados con el código.

Idealmente, entonces deberías ramificarte en un nivel inferior. es decir, rama 20 no tronco. De esa manera solo ramificas el contenido que debería ramificarse. es decir, que desea ramificado.

Puede lograrlo haciendo que solo el subdirectorio del código fuente de su copia de trabajo apunte a su rama.

svn cp http://example.com/svnrepo/trunk/source_code http://example.com/svnrepo/branches/development/source_code

cd ./source_code
svn sw http://example.com/svnrepo/branches/development/source_code

Haz los cambios, commit. Luego, fusionemos el tronco:

svn sw http://example.com/svnrepo/trunk/source_code
cd ..
svn merge -r [start_rev]:HEAD http://example.com/svnrepo/branches/development/source_code ./source_code

Revise para asegurarse de que todo esté bien:

svn diff | less

Y luego comprometerse. Listo.

Hacemos algo como esto:

-repo: Assemblies
--SomeAssembly
---Current
---v1.0
---v1.1
-repo: Source
--trunk
---Code
---Assemblies (external from Assemblies repo)
--branches
---v1.0
----Code
----Assemblies (external from Assemblies repo)
--Documents

En este ejemplo, los ensamblados de terceros tienen su propio repositorio. De esta manera no mantendrá versiones diferentes en cada rama y troncal. Como nota al margen, la última versión de cualquier ensamblaje se duplica en el " Actual " carpeta para cada ensamblaje. Esto permite que el ensamblaje se actualice sin tener que actualizar las referencias en todos sus proyectos. Puede que esto no sea un problema en su dominio, pero fue un gran dolor en el nuestro.

También tenga en cuenta que los documentos están en el mismo nivel en la jerarquía que el tronco y las ramas. De esta manera, esos archivos no se duplican. Si esto no es una opción, también pueden ser externos, lo que les permitiría estar presentes en el tronco y las ramas sin ser controlados por separado por la fuente.

La forma en que estructura su proyecto, junto con las restricciones del directorio de documentos, no se ajusta al modelo de SVN listo para usar.

Algunas ideas:

  • Mueva el directorio de documentos fuera del tronco y agréguelo como svn:external
  • Mueva el directorio de documentos fuera del tronco y haga que un script de compilación combine el tronco y el directorio de documentos
  • Combinar usando un script (en lugar de un svn merge directo), y hacer que el script aplique las reglas

De tu comentario:

  

Queremos evitar la modificación de documentos en 10 y 30. Deben modificarse solo en el tronco.

¿Ha considerado usar svn: externals en la rama desarrollo para 10 y 30? La referencia relativa desde la raíz usando ^ / probablemente sería un buen enfoque.

Entonces, mientras 10, 20, 30 y 40 serían accesibles en la rama, 10 y 30 todavía están referenciados desde el tronco. Luego puede definir su necesidades de autorización según sea necesario.

  

repo
  ..- > tronco
  ....- > 10
  ....- > 20
  ....- > 30
  ....- > 40
  ..- > ramas
  ....- > desarrollar
  ......- > 10 (vive en el tronco, svn: externos ^ / trunk / 10)
  ......- > 20 (vive en la rama, se fusiona con el tronco)
  ......- > 30 (vive en el tronco, svn: externos ^ / trunk / 30)
  ......- > 40 (vive en la rama, fusionarse con el tronco)

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