SVN comment résoudre “ajout local, add entrant lors de la mise à jour” dans un dossier *?

Voici mon scénario:

Supposons que nous ayons un repo SVN avec le contenu suivant: myfolder myfolder \ file.txt

Maintenant, je crée deux extraits de ce repo, co1 et co2.

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

  • svn supprimer mon dossier
  • svn commit
  • Créer un nouveau dossier nommé myfolder
  • svn add myfolder
  • svn commit

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

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

Je veux garder mon dossier et le fichier modifié, ainsi je résous le conflit d’arbre:

 svn resolve --accept working folder 

Maintenant, si j’essaie de commettre, j’obtiens “svn: Directory” / myfolder “est obsolète”. Si j’essaie de résoudre ceci en utilisant svn up myfolder, j’obtiens à nouveau un conflit d’arbre:

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

Ok, donc nous essayons à nouveau le dossier de travail svn resolve –accept. Mais nous ne pouvons toujours pas nous engager, nous recevons le même message que “svn: Directory” / myfolder “est obsolète”, si nous configurons mon dossier, nous revenons au dernier conflit de l’arborescence.

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

EDIT: script de ligne Windows cmd pour illustrer:

 rmdir /S /QC:\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 le résultat de l’exécution de ce script (notez les échecs de validation à la fin):

 C:\>rmdir /S /QC:\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 avec

     svn resolve --accept working PATH_TO_FILE 

    qui devrait aboutir à:

    État en conflit résolu de ‘PATH_TO_FILE’

    Tree Conflicts donne un bon aperçu des conflits d’arbres et de leur résolution. Dans certains cas, svn revert peut également aider, tout en perdant toutes vos modifications locales. En dernier recours, une nouvelle copie de travail avec des modifications fusionnées manuellement à partir des modifications «brisées» vous ramènera sur la bonne voie. Définitivement le côté obscur de la 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 de répertoire de folder identique à celle de co1 . Vous pouvez alors écraser avec le contenu du folder.SAVE .

    Je ne suis pas capable 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/twigs 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/twigs 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 avez faite et vous n’avez 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 ressortingction 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) comstackd 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 les modifications locales manuellement. Autrement dit, créez un fichier de correctif (svn diff> mine.patch ou copiez des fichiers ailleurs), annulez vos modifications ou résolvez-les avec les leurs, puis appliquez le correctif (ou recopiez les fichiers). Vous devrez peut-être copier la base de vos fichiers dans le dossier recréé avant d’appliquer vos modifications.

    Comme Zellus l’a dit, c’est le côté obscur de la subversion, et c’est quelque chose que l’implémentation actuelle est incapable de gérer. Ensuite, la suppression d’un dossier et l’ajout d’un nom identique ne semble pas correct. Que voulez-vous que subversion fasse? Que se passe-t-il si le fichier n’est pas recréé dans le dossier? Et si son contenu est différent?

    Essayez d’éviter la situation en supprimant un dossier que vous souhaitez conserver 🙂