web-dev-qa-db-fra.com

Étrange problème avec Subversion - "Le fichier existe déjà" lors de la tentative de recréation d'un répertoire UTILISÉ comme étant dans mon référentiel

Donc, j’avais un répertoire appelé mysql il ya quelques versions. Je l'ai supprimé et j'ai décidé de recommencer, mais lorsque j'essaie de créer le nouveau répertoire mysql, je rencontre toujours l'erreur "Le fichier existe déjà":

support:/etc/puppet/modules# mkdir mysql
support:/etc/puppet/modules# svn add mysql/
A         mysql
support:/etc/puppet/modules# svn commit -m " Test"
Adding         modules/mysql
svn: Commit failed (details follow):
svn: File already exists: filesystem '/var/lib/svn/puppet/db', transaction '11-r', path '/trunk/modules/mysql'
support:/etc/puppet/modules# svn delete mysql
svn: Use --force to override this restriction
svn: 'mysql' has local modifications
support:/etc/puppet/modules# svn --force delete mysql
D         mysql

J'ai vu d'autres publications suggérer de forcer une mise à jour

support:/etc/puppet/modules# svn status
support:/etc/puppet/modules# svn update
At revision 11.
support:/etc/puppet/modules# svn mkdir mysql
A         mysql
support:/etc/puppet/modules# svn commit -m "Test"
Adding         modules/mysql
svn: Commit failed (details follow):
svn: File already exists: filesystem '/var/lib/svn/puppet/db', transaction '11-s', path '/trunk/modules/mysql'
70
gnarf

J'ai réussi à contourner ce problème en revenant à la dernière version dans laquelle j'avais le répertoire mysql, puis en supprimant le contenu, en y mettant le nouveau contenu et en vérifiant les nouvelles informations. Bien que je sois curieux de savoir si n'importe qui a une meilleure explication de ce qui se passait là-bas.

11
gnarf

J'ai eu un problème comme celui-ci lorsque j'ai supprimé un dossier (et des sous-dossiers) et que je suis allé à les recréer à partir de zéro. Vous obtenez cette erreur en supprimant et en rajoutant manuellement des dossiers (alors que des fichiers semble bien se débrouiller avec ça).

Après quelques déconvenues frustrantes, j'ai trouvé que je devais:
(en utilisant TortoiseSVN sous Windows)

  1. Déplacez les dossiers en conflit de la copie de travail (pour ne pas perdre mon travail en cours)
  2. Faites un svn update Qui rajoute d'anciens fichiers/dossiers dans la copie de travail
  3. Dossier svn delete
  4. commit
  5. Copier le nouveau dossier dans la copie de travail (en veillant à supprimer tous les dossiers .svn qu'il contient)
  6. commit

Malheureusement, il (A) nécessite deux validations et (B) perd l'historique des révisions de fichier car il ne fait que remonter à la dernière ajout récente (à moins que quelqu'un ne puisse expliquer comment résoudre ce problème). Une solution alternative qui contourne ces 2 problèmes consiste à ignore les étapes 3 et 4, le seul problème étant que des fichiers anciens/inutiles peuvent toujours être présents dans votre répertoire. Vous pouvez les supprimer manuellement.

J'adorerais entendre des idées supplémentaires que d'autres pourraient avoir à ce sujet.

Simon.


[Mise à jour] OK, j'ai eu ce même problème à ce moment-là, mais le dossier incriminé n'était PAS dans le dernier commit, donc un update ne l'a pas restauré. Au lieu de cela, je devais parcourir le référentiel et delete le dossier incriminé. Je pourrais alors add revenir dans le dossier et commit avec succès.

62
Simon East

Avait un problème similaire. Pour le résoudre, mis à jour à partir de svn trunk avec l'option de priorité des fichiers locaux.

svn update path/ --accept=mine-full

Après vous pourriez vous engager comme d'habitude. Bien sûr, soyez prudent en l'utilisant.

17
Fedir RYKHTIK

déjà eu ce type de problème.

ma solution était:

supprimez le dossier de svn mais conservez une copie du dossier quelque part, validez les modifications. dans la copie de sauvegarde, supprimez récursivement tous les dossiers .svn qu’il contient. pour cela vous pourriez courir

#!/bin/bash

find -name '.svn' | while read directory;
do
    echo $directory;
    rm -rf "$directory";
done;

supprimez le référentiel local et re-vérifiez tout le projet. Je ne sais pas si la suppression ou le contrôle partiel est suffisant.

cordialement

12
Atmocreations

C’est une méchante erreur mystérieuse qui n’a pas de solution claire.

update/revert/commit ne fonctionnait PAS dans ma situation. Je n'avais rien fait de bizarre - juste quelques mouvements svn.

Quel travail DID a été pour moi:

svn remove offender
svn commit
cd ..
rm -fR parent
svn up parent
cd parent
svn remove offender again
svn commit
copy offender back in (minus .svn dirs)
svn add
svn commit

Bizarre pour le moins. Fondamentalement, le svn remove --force offender ne supprimait pas complètement pour une raison quelconque. C'est en quelque sorte ce que disait le message d'erreur. Ce n'est qu'en supprimant le parent, puis en le mettant à jour, que cela est devenu évident, car le délinquant a réapparu! svn retirer le délinquant à nouveau puis correctement supprimé.

7
user552904

Cette solution se fond parfaitement et ne perd pas de l'historique:

  1. Déplacer/copie de travail/délinquant vers un emplacement temporaire.
  2. Effectuez une extraction svn de svn + ssh: //svn.example.com/repo/offender vers/working-copy/offender.
  3. Déplacez manuellement vos fichiers de l'emplacement temporaire dans la nouvelle extraction.
  4. Supprimer l'emplacement temporaire.
1
user69173

J'ai rencontré ce problème aujourd'hui quand Xcode est tombé en panne lors d'une fusion de branche. D'une manière ou d'une autre, le fichier a été chargé dans le référentiel svn mais il n'a pas été enregistré correctement dans la base de données svn. J'ai exécuté les commandes suivantes dans le répertoire où le fichier existait localement:

svn revert bad.file
svn del svn://my.svnserver.com/svnDB/path/to/the/offending/file/bad.file

Ensuite, j'ai ré-ajouté le fichier à partir de mon système local:

svn add bad.file
svn commit -m "Re adding bad.file"

Succès!

1
Wolfsokta

J'ai eu ce problème sur un projet que je lance sur Netbeans. J'ai simplement cliqué avec le bouton droit sur le fichier et mis à jour pour le réparer (après SVN).

1
phil
  1. renommer le nouveau chemin en temp
  2. retourne le nouveau chemin (pas temporaire!) donc svn n'essaye pas de le commettre
  3. commettez le reste de vos modifications
  4. copiez le chemin dans le référentiel: svn copy -m "chemin copié" -r
  5. mettre à jour votre copie de travail
  6. mv tous les fichiers de temp au nouveau chemin, qui provient de la mise à jour
  7. valider vos modifications locales depuis la révision
  8. Bonne journée avec histoire ;-)
1
Yildirim Karal

Je ne sais pas si cela vous aide, mais je suppose que lorsque vous faites un svn add mysql après que vous l’ayez effacé, le dossier sera ré-instancié (alors ne faites pas un mkdir vous-même). Si vous créez un répertoire vous-même, svn attend un répertoire .svn à l'intérieur de celui-ci car il le sait déjà.

1
Simon Groenewolt

Selon la solution d’Atmocreation, il n’est pas nécessaire de revérifier l’ensemble du projet, ce qui est utile si vous avez déjà des travaux en cours.

Disons que vous avez une copie de travail:

/foo/

qui contient des répertoires:

/foo/bar/baz

et vous obtenez le message d'erreur sur commit:

svn: File already exists: filesystem '/foo/bar'

Sauvegardez le contenu de la barre quelque part:

mkdir -p ~/tmp/code_backup
cp -r /foo/bar ~/tmp/code_backup

Supprimez les répertoires de contrôle .svn de la sauvegarde. Assurez-vous de bien exécuter cette commande, sinon vous pouvez faire des dégâts assez graves !! Supprimez-les manuellement si vous n'êtes pas sûr.

find ~/tmp/code_backup/bar -name .svn -type d -exec rm -rf {} \;

Vérifiez que la copie est identique:

diff -r -x .svn dist ~/tmp/code_backup/dist

Supprimez le répertoire incriminé de la copie de travail: cd/foo rm -rf bar

Et puis le restaurer depuis le référentiel:

cd /foo
svn update bar

Recopiez les fichiers modifiés à partir de la sauvegarde:

cp -r ~/tmp/code_backup/bar /foo/

Vous devriez maintenant pouvoir commettre sans l'erreur.

0
River Satya

Ce dont vous avez besoin, c'est de la commande svn 'export'. Avec cela, vous pouvez mettre un fichier ou une arborescence de répertoires complète dans l'état d'une autre révision dans une autre branche.

Donc quelque chose comme

rm file #without 'svn' in front!
svn export myrepo/path/to/file@<revision> .
svn commit
0
CodeKid

Cette situation s'est produite s'il y a un objet dans le référentiel, qui crée par la transaction en cours.

Scénario simple:

  1. extraire un répertoire deux fois, comme DIR1 et DIR2
  2. faire 'svn mkdir test' dans les deux
  3. faire commettre de DIR1
  4. essayez de faire commettre DIR2 (sans svn up), SVN renverra cette erreur

Même chose lorsque vous ajoutez les mêmes fichiers à partir de deux copies de travail.

0
Denis Barmenkov