web-dev-qa-db-fra.com

SVN comment résoudre "ajout local, ajout entrant lors de la mise à jour" sur un * dossier *?

Voici mon scénario:

Supposons que nous ayons un dépôt SVN avec le contenu suivant: mon dossier mon dossier\fichier.txt

Maintenant, je crée deux extractions de ce dépôt, co1 et co2.

En co1, nous modifions file.txt. En co2 nous:

  • svn supprimer mon dossier
  • svn commit
  • Créez un nouveau dossier nommé myfolder
  • svn ajouter mon dossier
  • svn commit

Maintenant, si je tente une mise à jour dans co1, j'obtiens un conflit d'arbre:

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

Je veux conserver mon dossier et le fichier modifié, donc je résous le conflit d'arborescence:

svn resolve --accept working folder

Maintenant, si j'essaie de valider, j'obtiens "svn: le répertoire '/ mon dossier' est obsolète". Si j'essaie de résoudre ce problème en utilisant svn up myfolder, j'obtiens à nouveau un conflit d'arborescence:

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

D'accord, nous essayons donc de résoudre svn - accepter à nouveau le dossier de travail. Mais nous ne pouvons toujours pas nous engager, nous obtenons le même message que "svn: Le répertoire '/ monfolder' est obsolète", si nous faisons svn up myfolder, nous revenons directement au dernier conflit d'arborescence.

Quelle est la bonne procédure pour résoudre ce type de conflit (lorsque nous souhaitons conserver mon dossier et ses modifications)?

EDIT: script de ligne cmd Windows pour illustrer:

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 ""

Et voici la sortie de l'exécution de ce script (notez les échecs de validation à la fin):

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
48
Ziphnor

J'ai compris

svn resolve --accept working  PATH_TO_FILE

qui devrait aboutir à:

État conflictuel résolu de 'PATH_TO_FILE'

41
augusto

Conflits d'arbre donne un bel aperçu des conflits d'arbre et de leur résolution. Dans certains cas svn revert pourrait également vous aider, tout en perdant toutes vos modifications locales. En dernier recours, une nouvelle copie de travail avec des modifications fusionnées manuellement de la "cassée" vous ramènera sur la bonne voie. Certainement le côté sombre de Subversion.

16
zellus

Essayer

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

Svn devrait alors apporter une nouvelle version du répertoire folder identique à celle de co1. Vous pouvez ensuite remplacer le contenu de folder.SAVE.

4
hlovdal

Je ne suis pas en mesure de reproduire ce que vous avez mentionné. Voici ce que j'ai essayé.

test@test:/tmp$ cd /tmp/ 
test@test:/tmp$ svn co http://localhost:8080/svn/stackoverflow so --username=admin
A    so/trunk
A    so/branches
A    so/tags
Checked out revision 1.
test@test:/tmp$ cd so/trunk/ 
test@test:/tmp/so/trunk$ mkdir x 
test@test:/tmp/so/trunk$ ls /tmp > x/test.txt 
test@test:/tmp/so/trunk$ svn add x/ 
A         x
A         x/test.txt
test@test:/tmp/so/trunk$ svn ci -m "test"
Adding         trunk/x
Adding         trunk/x/test.txt
Transmitting file data .
Committed revision 2.
test@test:/tmp/so/trunk$ cd /tmp/ 
test@test:/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.
test@test:/tmp$ cd /tmp/so1/trunk/ 
test@test:/tmp/so1/trunk$ svn remove x 
D         x/test.txt
D         x
test@test:/tmp/so1/trunk$ svn ci -m "" 
Deleting       trunk/x

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

Apparemment, j'ai essayé la même approche que vous et je n'ai plus rencontré de problème. Quelle version de svn utilisez-vous?

export REPOPATH=/tmp/svntest
test@test:/tmp/co2/trunk$ rm -rf $REPOPATH
test@test:/tmp/co2/trunk$ mkdir $REPOPATH
test@test:/tmp/co2/trunk$ svnadmin create $REPOPATH/repo
test@test:/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'
test@test:/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'
test@test:/tmp/co2/trunk$ 
test@test:/tmp/co2/trunk$ cd $REPOPATH/co1
bash: cd: /tmp/svntest/co1: No such file or directory
test@test:/tmp/co2/trunk$ mkdir folder
mkdir: cannot create directory `folder': File exists
test@test:/tmp/co2/trunk$ echo content > folder/file.txt
test@test:/tmp/co2/trunk$ svn add folder
svn: warning: 'folder' is already under version control
test@test:/tmp/co2/trunk$ svn commit folder -m ""
test@test:/tmp/co2/trunk$ 
test@test:/tmp/co2/trunk$ cd $REPOPATH/co2
bash: cd: /tmp/svntest/co2: No such file or directory
test@test:/tmp/co2/trunk$ svn up
At revision 10.
test@test:/tmp/co2/trunk$ 
test@test:/tmp/co2/trunk$ cd $REPOPATH/co1
bash: cd: /tmp/svntest/co1: No such file or directory
test@test:/tmp/co2/trunk$ svn del folder
svn: Use --force to override this restriction
svn: 'folder/file.txt' is not under version control
test@test:/tmp/co2/trunk$ svn commit -m ""
test@test:/tmp/co2/trunk$ mkdir folder
mkdir: cannot create directory `folder': File exists
test@test:/tmp/co2/trunk$ svn add folder
svn: warning: 'folder' is already under version control
test@test:/tmp/co2/trunk$ svn commit -m ""
test@test:/tmp/co2/trunk$ 
test@test:/tmp/co2/trunk$ cd $REPOPATH/co2
bash: cd: /tmp/svntest/co2: No such file or directory
test@test:/tmp/co2/trunk$ echo changed_content > folder\file.txt
test@test:/tmp/co2/trunk$ svn up
At revision 10.
test@test:/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
1

Dans ce cas particulier, je pense que vous devrez réappliquer manuellement les modifications locales. Autrement dit, créez un fichier de correctif (svn diff> mine.patch ou copiez les fichiers ailleurs), annulez vos modifications ou résolvez-les en utilisant les leurs, puis appliquez le correctif (ou copiez les fichiers). Vous devrez peut-être copier svn la base de vos fichiers dans le dossier recréé avant d'appliquer vos modifications.

Comme l'a dit zellus, c'est le côté sombre de Subversion, et c'est quelque chose que l'implémentation actuelle est incapable de gérer. Là encore, la suppression d'un dossier et l'ajout d'un dossier de même nom ne semble pas tout à fait correct. Qu'attendriez-vous de Subversion? Que faire si le fichier n'est pas recréé dans le dossier? Et si son contenu est différent?

Essayez d'éviter complètement la situation en ne supprimant pas un dossier que vous souhaitez conserver :)

0
Mikkel Blanné