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:
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
J'ai compris
svn resolve --accept working PATH_TO_FILE
qui devrait aboutir à:
État conflictuel résolu de 'PATH_TO_FILE'
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.
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
.
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
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 :)