2009-04-20 4 views
20

Cela peut être impossible, mais je vais demander quand même. Sans entrer dans les détails de pourquoi c'est comme ça, j'ai deux checkouts primaires dans lesquels je travaille, un pour la branche de production, et un pour le tronc. Chacun d'entre eux est une petite collection de références svn: externals à des sous-projets, sans contenu direct sous le répertoire svn extrait. Autrement dit, les quatre directives svn: externals ajoutent tout le contenu de chacun des répertoires de contrôle. Lorsque je fais une validation via Eclipse (/ Subclipse), je peux valider des modifications sur tous les projets externes en une seule fois, ce qui est bien car ce ne sont que des sous-projets séparés dans le même référentiel, ce qui me permet de évitez de faire 4 commits séparés d'affilée au même repo.Comment puis-je faire un seul commit SVN sur plusieurs externes à la ligne de commande?

Est-il impossible de faire la même chose à partir de la ligne de commande? Les validations pour chacun des éléments externes peuvent certainement être scriptées et aliasées en une seule commande, mais je préfère éviter d'encombrer le journal de validation avec des validations séparées pour les modifications connexes, si possible.

Répondre

7

Malheureusement, votre hypothèse était correcte. L'outil de ligne de commande subversion actuel ne se recurera pas en copies de travail externes disjointes pendant une validation. Eclipse se rend probablement compte que tout est rooté et ajuste tout pour ne faire qu'une seule transaction de validation.

Cet inconvénient du client est en fait répertorié comme l'un des problèmes à surveiller lors de la définition des éléments externes dans votre projet. Depuis le client 1.6.1, cette limitation existe toujours.

9

Vous pouvez spécifier tous les fichiers et dossiers que vous souhaitez valider dans le client de ligne de commande, y compris les externes. Étant donné que le CL ne récursion pas en externals, vous devez spécifier ceux de votre commande séparément commit:

svn ci working_copy externals1 externals2 -m "log message" 

N'a pas essayé cependant. Si cela ne fonctionne pas, vous devez spécifier tous les fichiers et dossiers modifiés séparément, pas seulement les dossiers 'root' des externes.

+0

Malheureusement je ne peux pas tester cela dans mon installation existante comme deux des externes fake un répertoire parent commun donc je reçois une erreur indiquant que ce n'est pas un répertoire de travail (parce que ce n'est pas) lorsque vous tentez votre solution comme: svn ci htdocs/intra htdocs/scripts de mise à jour inclut -m "msg" –

+0

... et il n'y a aucune modification à valider dans les scripts et les includes. –

+8

Je sais que c'est plus ancien que la saleté à ce stade, mais ce qui précède ne fonctionne pas pour les chemins externes relatifs (externes qui appartiennent au même référentiel.) Vous obtenez "Toutes les cibles font partie de la même copie de travail? } ".Cela fonctionne si vous faites des chemins d'accès complets à chaque fichier. – MightyE

-2

Vous pouvez faire:

svn ci -m"my comment" * 
+0

veuillez développer votre réponse et expliquer pourquoi cette commande accomplit la tâche – WebChemist

1

Si vous avez seulement le contenu et aucune modification d'attributs, vous pouvez faire quelque chose le long:

svn st | egrep "^M" | awk '{print $2}' | xargs svn ci -m 'your message' 

Si vous avez ajoutés/supprimés, ... fichiers, vous pouvez modifier l'expression rationnelle egrep pour l'adapter à vos besoins.

0

J'itérer sur tous les externals, et exécuter "svn commit" sur chacun, tels que:

for dir in $(svn propget svn:externals . | awk '{print $2}'); do svn commit $dir; done 
2

Avec la dernière SVN vous pouvez faire: --include-externals

Questions connexes