2009-06-08 7 views
5

Je voudrais ajouter tous les fichiers non versionnés dans un répertoire à SVN en utilisant SharpSVN.Ajouter un fichier en utilisant SharpSVN

J'ai essayé commandes régulières svn sur la ligne de commande abord:

C:\temp\CheckoutDir> svn status -v 

Je vois tous subdirs, tous les fichiers qui sont déjà enregistré quelques nouveaux fichiers étiquetée, rien avec le « L « ? » "indication de verrouillage

C:\temp\CheckoutDir> svn add . --force 

Il en résulte dans tous les nouveaux fichiers dans les sous-répertoires, qui sont déjà en eux-mêmes le contrôle de version, à ajouter.

Je voudrais faire la même chose avec SharpSVN. Je copie quelques fichiers supplémentaires dans le même répertoire et exécuter ce code:

... 
using (SharpSvn.SvnClient svn = new SvnClient()) 
{ 
    SvnAddArgs saa = new SvnAddArgs(); 
    saa.Force = true; 
    saa.Depth = SvnDepth.Infinity; 
    try 
    { 
     svn.Add(@"C:\temp\CheckoutDir\." , saa); 
    } 
    catch (SvnException exc) 
    { 
     Log(@"SVN Exception: " + exc.Message + " - " + exc.File); 
    } 
} 

Mais un SvnException est élevé:

  • SvnException.Message: copie de travail 'C: \ temp \ CheckoutDir' verrouillé
  • SvnException.File: .. \ .. \ .. \ subversion \ libsvn_wc \ lock.c »

Aucune autre instance svnclient est en cours d'exécution dans mon code, je aussi essayé d'appeler

svn.cleanup() 

juste avant l'ajout, mais en vain.

Depuis le documentation est plutôt vague;), Je me demandais si quelqu'un ici connaissait la réponse.

Merci d'avance!

Jan

+1

Avez-vous essayé de demander sur les forums de discussion SharpSVN? Vous pourriez probablement obtenir une meilleure réponse là-bas. – hao

+0

Je vais, dans le même temps j'ai regardé dans le code de tests unitaires: http://sharpsvn.open.collab.net/source/browse/sharpsvn/trunk/src/SharpSvn.Tests/Commands/AddTests.cs TestAddDirectoryRecursively fait quelque chose de similaire, mais Ajoute un nouveau dir1 sous WorkingcopyPath et everyting dedans. Je voudrais ajouter tout sous WorkingCopyPath lui-même. – jan

Répondre

5

Utilisez mon outil http://svncompletesync.codeplex.com/ ou prenez-le comme exemple. Il fait exactement ce dont vous avez besoin.

+0

Excellent outil Malcom, fait exactement ce qu'il dit sur la boîte. +1 –

1

Je pense que vous ne devriez pas le suffixe du chemin avec une ''. Essayez:

svn.Add(@"C:\temp\CheckoutDir" , saa); 

S'il vous plaît ne discuter plus sur la liste carte/mailing de discussion SharpSvn, parce que le comportement que vous voyez peut-être un bug.

+0

Le code que vous proposez me dit: "C: \ temp" n'est pas sous contrôle de version. Ce qui est juste. Mais ne m'aide pas. Je posterai sur les forums dès que possible. Merci! – jan

2

J'ai essayé l'outil de Malcolm mais je n'arrivais pas à le faire fonctionner maintenant qu'il semble avoir quelques années, mais après avoir regardé le code source, il semble que ce soit vraiment tout ce dont vous avez besoin pour synchroniser les contrôles locaux sur le dossier avec celui dans SVN:

string _localCheckoutPath = @"C:\temp\CheckoutDir\"; 
SvnClient client = new SvnClient(); 

Collection<SvnStatusEventArgs> changedFiles = new Collection<SvnStatusEventArgs>(); 
client.GetStatus(_localCheckoutPath, out changedFiles); 

//delete files from subversion that are not in filesystem 
//add files to suversion , that are new in filesystem 

foreach (SvnStatusEventArgs changedFile in changedFiles) 
{ 
    if (changedFile.LocalContentStatus == SvnStatus.Missing) 
    { 
     client.Delete(changedFile.Path); 
    } 
    if (changedFile.LocalContentStatus == SvnStatus.NotVersioned) 
    { 
     client.Add(changedFile.Path); 
    } 
} 

SvnCommitArgs ca = new SvnCommitArgs(); 
ca.LogMessage = "Some message..."; 

client.Commit(_localCheckoutPath, ca); 
Questions connexes