2010-10-21 12 views
45

Aquí es mi escenario:SVN cómo resolver "agregar localmente, agregar información después de la actualización" en una * carpeta *?

Asumamos que tenemos un repositorio SVN con el siguiente contenido: myfolder myfolder \ archivo.txt

Ahora puedo crear dos cajas de este repo, CO1 y CO2.

En co1 modificamos file.txt. en el CO2 que:

  • svn delete myfolder
  • SVN
  • Crear una nueva carpeta llamada myfolder
  • SVN añaden myfolder
  • SVN

Ahora si intento una actualización en co1 obtengo un conflicto de árbol:

A + C myfolder > local edit, incoming delete upon update 
M + myfolder\file.txt 

quiero seguir myfolder y el archivo modificado, por lo que resuelve el conflicto de árbol:

svn resolve --accept working folder 

Ahora bien, si lo intento de cometer, consigo "svn: El directorio '/ myfolder' no está actualizado" . Si trato de resolver este usando svn hasta myfolder, aparece un nuevo conflicto de árbol:

A + C folder > local add, incoming add upon update 
M + myfolder\file.txt 

bien, así que tratamos de resolver SVN --Acepte carpeta de trabajo de nuevo. Pero todavía no podemos comprometernos, obtenemos el mismo mensaje que "svn: Directorio '/ mi carpeta' está desactualizado ', si hacemos svn up myfolder, volvemos al último conflicto de árbol.

¿Cuál es el procedimiento correcto para resolver este tipo de conflicto (cuando deseamos mantener myfolder y sus cambios)?

EDIT: script de línea de cmd de Windows para ilustrar:

rmdir /S /Q C:\svntest 
mkdir C:\svntest 

cd C:\svntest 

svnadmin create repo 

svn co file:///c:/svntest/repo co1 
svn co file:///c:/svntest/repo co2 

cd co1 
mkdir folder 
echo content > folder\file.txt 
svn add folder 
svn commit folder -m "" 

cd C:\svntest\co2 
svn up 

cd C:\svntest\co1 
svn del folder 
svn commit -m "" 
mkdir folder 
svn add folder 
svn commit -m "" 

cd C:\svntest\co2 
echo changed_content > folder\file.txt 
svn up 
svn resolve --accept working folder 
svn commit -m "" 

svn up folder 
svn resolve --accept working folder 
svn commit -m "" 

Y aquí está la salida de funcionamiento de ese guión (tenga en cuenta los fallos de cometer al final):

C:\>rmdir /S /Q C:\svntest 

C:\>mkdir C:\svntest 

C:\>cd C:\svntest 

C:\svntest>svnadmin create repo 

C:\svntest>svn co file:///c:/svntest/repo co1 
Checked out revision 0. 

C:\svntest>svn co file:///c:/svntest/repo co2 
Checked out revision 0. 

C:\svntest>cd co1 

C:\svntest\co1>mkdir folder 

C:\svntest\co1>echo content 1>folder\file.txt 

C:\svntest\co1>svn add folder 
A   folder 
A   folder\file.txt 

C:\svntest\co1>svn commit folder -m "" 
Adding   folder 
Adding   folder\file.txt 
Transmitting file data . 
Committed revision 1. 

C:\svntest\co1>cd C:\svntest\co2 

C:\svntest\co2>svn up 
A folder 
A folder\file.txt 
Updated to revision 1. 

C:\svntest\co2>cd C:\svntest\co1 

C:\svntest\co1>svn del folder 
D   folder\file.txt 
D   folder 

C:\svntest\co1>svn commit -m "" 
Deleting  folder 

Committed revision 2. 

C:\svntest\co1>mkdir folder 

C:\svntest\co1>svn add folder 
A   folder 

C:\svntest\co1>svn commit -m "" 
Adding   folder 

Committed revision 3. 

C:\svntest\co1>cd C:\svntest\co2 

C:\svntest\co2>echo changed_content 1>folder\file.txt 

C:\svntest\co2>svn up 
C folder 
At revision 3. 
Summary of conflicts: 
    Tree conflicts: 1 

C:\svntest\co2>svn resolve --accept working folder 
Resolved conflicted state of 'folder' 

C:\svntest\co2>svn commit -m "" 
Adding   folder 
svn: Commit failed (details follow): 
svn: Directory '/folder' is out of date 

C:\svntest\co2>svn up folder 
    C folder 
At revision 3. 
Summary of conflicts: 
    Tree conflicts: 1 

C:\svntest\co2>svn resolve --accept working folder 
Resolved conflicted state of 'folder' 

C:\svntest\co2>svn commit -m "" 
Adding   folder 
svn: Commit failed (details follow): 
svn: Directory '/folder' is out of date 
+0

@Azirath: He actualizado mi respuesta, me puede decir qué la versión de svn que estás usando? –

+0

Perdón por el largo tiempo de respuesta, tuve que hacer que esta cuenta no registrada se fusionara con mi cuenta real. Vea mi respuesta en los comentarios a su respuesta. – Ziphnor

Respuesta

15

Tree Conflicts da un buen descripción general de conflictos de árbol y su resolución. En algunos casos, svn revert también podría ayudar, al perder todas las modificaciones locales. Como último recurso, una nueva copia de trabajo con cambios fusionados manualmente desde el 'roto' lo hará volver al camino correcto. Definitivamente el lado oscuro de la subversión.

+1

Lamentablemente, ya he comprobado esa visión general de los conflictos entre los árboles, pero lamentablemente no me dice cómo resolver este escenario específico. Encontré este problema en nuestra aplicación que se basa en SVN para manejar a cierto usuario, no en la línea de comandos, y por lo tanto, me gustaría evitar extraños hacks y mantener el uso de la API SVN. – Ziphnor

+1

Acabo de tener un problema con un error de conflicto de árbol de "Conflicto de árbol: agregar local, agregar entrante después de la actualización". Probé la opción svn revert que sugirió y funcionó de maravilla. Me olvidé completamente que podía hacer eso (ya que casi nunca tengo que usar ese comando). ¡Gracias! – pthurmond

1

No puedo reproducir lo que ha mencionado. Esto es lo que he intentado.

[email protected]:/tmp$ cd /tmp/ 
[email protected]st:/tmp$ svn co http://localhost:8080/svn/stackoverflow so --username=admin 
A so/trunk 
A so/branches 
A so/tags 
Checked out revision 1. 
[email protected]:/tmp$ cd so/trunk/ 
[email protected]:/tmp/so/trunk$ mkdir x 
[email protected]:/tmp/so/trunk$ ls /tmp > x/test.txt 
[email protected]:/tmp/so/trunk$ svn add x/ 
A   x 
A   x/test.txt 
[email protected]:/tmp/so/trunk$ svn ci -m "test" 
Adding   trunk/x 
Adding   trunk/x/test.txt 
Transmitting file data . 
Committed revision 2. 
[email protected]:/tmp/so/trunk$ cd /tmp/ 
[email protected]:/tmp$ svn co http://localhost:8080/svn/stackoverflow so1 --username=admin 
A so1/trunk 
A so1/trunk/x 
A so1/trunk/x/test.txt 
A so1/branches 
A so1/tags 
Checked out revision 2. 
[email protected]:/tmp$ cd /tmp/so1/trunk/ 
[email protected]:/tmp/so1/trunk$ svn remove x 
D   x/test.txt 
D   x 
[email protected]:/tmp/so1/trunk$ svn ci -m "" 
Deleting  trunk/x 

Committed revision 3. 
[email protected]:/tmp/so1/trunk$ mkdir x 
[email protected]:/tmp/so1/trunk$ cp ../../so/trunk/x/test.txt x 
[email protected]:/tmp/so1/trunk$ ll /tmp > x/test.txt 
[email protected]:/tmp/so1/trunk$ svn add x/ 
A   x 
A   x/test.txt 
[email protected]:/tmp/so1/trunk$ svn ci -m "" 
Adding   trunk/x 
Adding   trunk/x/test.txt 
Transmitting file data . 
Committed revision 4. 
[email protected]:/tmp$ cd so/trunk/ 
[email protected]:/tmp/so/trunk$ svn up 
D x 
A x 
A x/test.txt 
Updated to revision 4. 
[email protected]:/tmp/so/trunk$ 

Aparentemente probé el mismo enfoque que usted hizo y no volvió a tener ningún problema. ¿Qué versión de svn estás usando?

export REPOPATH=/tmp/svntest 
[email protected]:/tmp/co2/trunk$ rm -rf $REPOPATH 
[email protected]:/tmp/co2/trunk$ mkdir $REPOPATH 
[email protected]:/tmp/co2/trunk$ svnadmin create $REPOPATH/repo 
[email protected]:/tmp/co2/trunk$ svn co file:///$REPOPATH/repo co1 
svn: Repository UUID '2d803eb8-2030-4dd3-bb6f-34ab07c74813' doesn't match expected UUID '82764ae8-6410-4565-933f-9a420cb60013' 
[email protected]:/tmp/co2/trunk$ svn co file:///$REPOPATH/repo co2 
svn: Repository UUID '2d803eb8-2030-4dd3-bb6f-34ab07c74813' doesn't match expected UUID '82764ae8-6410-4565-933f-9a420cb60013' 
[email protected]:/tmp/co2/trunk$ 
[email protected]:/tmp/co2/trunk$ cd $REPOPATH/co1 
bash: cd: /tmp/svntest/co1: No such file or directory 
[email protected]:/tmp/co2/trunk$ mkdir folder 
mkdir: cannot create directory `folder': File exists 
[email protected]:/tmp/co2/trunk$ echo content > folder/file.txt 
[email protected]:/tmp/co2/trunk$ svn add folder 
svn: warning: 'folder' is already under version control 
[email protected]:/tmp/co2/trunk$ svn commit folder -m "" 
[email protected]:/tmp/co2/trunk$ 
[email protected]:/tmp/co2/trunk$ cd $REPOPATH/co2 
bash: cd: /tmp/svntest/co2: No such file or directory 
[email protected]:/tmp/co2/trunk$ svn up 
At revision 10. 
[email protected]:/tmp/co2/trunk$ 
[email protected]:/tmp/co2/trunk$ cd $REPOPATH/co1 
bash: cd: /tmp/svntest/co1: No such file or directory 
[email protected]:/tmp/co2/trunk$ svn del folder 
svn: Use --force to override this restriction 
svn: 'folder/file.txt' is not under version control 
[email protected]:/tmp/co2/trunk$ svn commit -m "" 
[email protected]:/tmp/co2/trunk$ mkdir folder 
mkdir: cannot create directory `folder': File exists 
[email protected]:/tmp/co2/trunk$ svn add folder 
svn: warning: 'folder' is already under version control 
[email protected]:/tmp/co2/trunk$ svn commit -m "" 
[email protected]:/tmp/co2/trunk$ 
[email protected]:/tmp/co2/trunk$ cd $REPOPATH/co2 
bash: cd: /tmp/svntest/co2: No such file or directory 
[email protected]:/tmp/co2/trunk$ echo changed_content > folder\file.txt 
[email protected]:/tmp/co2/trunk$ svn up 
At revision 10. 
[email protected]:/tmp/co2/trunk$ svn --version 
svn, version 1.6.6 (r40053) 
    compiled Dec 12 2009, 05:04:54 

Copyright (C) 2000-2009 CollabNet. 
Subversion is open source software, see http://subversion.tigris.org/ 
This product includes software developed by CollabNet (http://www.Collab.Net/). 

The following repository access (RA) modules are available: 

* ra_neon : Module for accessing a repository via WebDAV protocol using Neon. 
    - handles 'http' scheme 
    - handles 'https' scheme 
* ra_svn : Module for accessing a repository using the svn network protocol. 
    - with Cyrus SASL authentication 
    - handles 'svn' scheme 
* ra_local : Module for accessing a repository on local disk. 
    - handles 'file' scheme 
+0

He agregado una secuencia de comandos a la publicación original para ilustrar mi situación con más detalle. – Ziphnor

+0

La diferencia parece ser que en mi caso el archivo se modifica en la copia de trabajo que realiza la actualización ("así que"), no en la copia de trabajo que realiza la eliminación ("so1") como en el caso del script. – Ziphnor

+0

No estoy seguro de qué está pasando en su salida, ¿parece que está recibiendo muchos errores? – Ziphnor

0

En este caso particular, creo que tendrá que volver a aplicar los cambios locales manualmente. Es decir, crea un archivo de parche (svn diff> mine.parchear, o copiar archivos en otro lugar), revertir los cambios o resolverlos usando los suyos, luego aplicar el parche (o copiar los archivos nuevamente). Quizás necesite svn copiar la base de sus archivos nuevamente en la carpeta recreada antes de aplicar sus cambios.

Como dijo zellus, es el lado oscuro de la subversión, y esto es algo que la implementación actual no puede manejar. Por otra parte, borrar una carpeta y volver a agregar un nombre idéntico no suena del todo bien. ¿Qué esperarías que haga la subversión? ¿Qué ocurre si el archivo no se recrea en la carpeta? ¿Qué pasa si su contenido es diferente?

tratar de evitar la situación por completo al no borrar una carpeta que desea mantener :)

+0

Como se mencionó anteriormente, encontramos este problema en el uso de nuestras aplicaciones de SVN (a través de SharpSVN) como un sistema interno de control de versiones para datos de usuarios compartidos. En nuestro caso, no es el mismo usuario el que borra la carpeta, sino que es una eliminación del lado del servidor que causa que el próximo cliente que actualice vuelva a crear la carpeta. Simplemente esperaba que SVN me diera una forma de especificar que el contenido actual de mi copia de trabajo se haya fusionado con la revisión dada en el servidor, lo que me permite confirmar el resultado. – Ziphnor

2

Trate

C:\svntest\co2>move folder folder.SAVE 
C:\svntest\co2>svn revert folder 
C:\svntest\co2>svn update 

Svn continuación, debe traer una nueva versión folder directorio idéntica a la de co1. A continuación, puede sobrescribir con el contenido de folder.SAVE.

33

me di cuenta con

svn resolve --accept working PATH_TO_FILE 

que debe terminar con:

Resuelta estado de conflicto de 'vía_al_archivo'

Cuestiones relacionadas