Comment puis-je «svn ajouter» tous les fichiers non versionnés à SVN?

177

Je recherche un bon moyen de "svn ajouter" automatiquement tous les fichiers non versionnés dans une copie de travail à mon référentiel SVN.

J'ai un serveur live qui peut créer quelques fichiers qui devraient être sous contrôle de source. J'aimerais avoir un court script que je puisse exécuter pour les ajouter automatiquement, au lieu de les parcourir et de les ajouter un à la fois.

Mon serveur exécute Windows Server 2003, donc une solution Unix ne fonctionnera pas.

JerSchneid
la source
1
@Saul Cette question est clairement antérieure à celle que vous avez liée, donc je ne vois pas comment cela peut être un doublon. Si quoi que ce soit, l'autre question est le double.
Neutrino
Cygwin est une option. Vous donne la puissance de bash sur n'importe quel environnement Windows. Je suis un utilisateur depuis plus de 10 ans avec des problèmes très mineurs.
user151841

Réponses:

346

svn add --force * --auto-props --parents --depth infinity -q

Bon conseil! Une remarque: mon Eclipse ajoute automatiquement de nouveaux fichiers à la liste des ignorés. C'est peut-être une question de configuration, mais de toute façon: il y a l' --no-ignoreoption qui aide.

Après cela, vous pouvez vous engager:

svn commit -m 'Adding a file'
Ronan
la source
14
Bon conseil. Bien mieux que d'utiliser le statut svn. "svn add --force" semble être suffisant.
Nom
1
Existe-t-il un moyen simple de définir cela sur une macro raccourcie (c'est-à-dire, comme vous pouvez le faire avec git)? Aussi, serait-il possible de mettre à jour cette réponse pour qu'elle explique chaque bit?
MrDuk
2
@MrDuk: Raccourci: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- Expliqué:svn help add
Ronan
17
Le problème est-il correct d'ajouter des fichiers ignorés? Pas souhaitable.
ladieu
1
@Name - vous devez mettre *à la fin, sinon cela ne fonctionnerait pas (au bail pour moi)
vsync
72

C'est une question différente de la mienne, mais il y a une réponse qui appartient à cette question:

svn status | grep '?' | sed 's/^.* /svn add /' | bash
Sam Safran
la source
8
Cela utilise des outils UNIX (grep, sed, bash) que l'OP a dit ne pas avoir.
Naaff
3
aussi vous pourriez probablement déterrer sed et grep sur Windows si vous le vouliez vraiment.
Sam Saffron le
1
Désolé pour ce vote positif sur le commentaire cygwin, n'était pas intentionnel (et je ne peux pas l'annuler). En fait, je pense que cygwin est aussi moche que vous pouvez obtenir sur Windows. Vous pouvez toujours utiliser findstr au lieu de grep qui fonctionnera au moins depuis Windows 2000 sans rien installer de plus.
Joey
@Johannes juste pour vous meta.stackexchange.com/questions/1775/…
Sam Saffron
2
Je suis avec mbyrne215; cette réponse m'a aidé plus que la solution du PO, alors je vote. Fonctionne parfaitement sous OS X 10.6.7.
Asbjørn Ulsberg
37

Ce qui fonctionne, c'est ceci:

c:\work\repo1>svn add . --force

Ajoute le contenu des sous-répertoires.

N'ajoute pas de fichiers ignorés.

Répertorie les fichiers ajoutés.

Le point dans la commande indique le répertoire actuel, il peut être remplacé par un nom de répertoire ou un chemin spécifique si vous souhaitez ajouter un répertoire différent de celui actuel.

Neutrino
la source
En fait, cela devrait être .\*ou si svn root est sur un répertoire différent stuff\svn_root\*.
Nux
Je ne suis pas. Les commandes à SVN s'exécutent dans le contexte du chemin à partir duquel elles sont exécutées, c'est normal. "svn add. \ *" seul ne se répète pas et imprime une charge de spam d'avertissement rendant impossible de voir ce qui a été réellement ajouté. "svn add. \ * --force" recurse mais affiche également "svn: Skipping argument: E200025: '. \. svn' se termine par un nom réservé". Cela semble donc pire que ma solution initiale.
Neutrino
Je faisais remarquer que vous n'avez probablement pas de lecteur C entier sur SVN ;-), et que vous devriez donc ajouter un chemin. Et à partir de mes tests, spécifier le chemin comme stuff\svn_rootn'ajoute pas de fichiers dans les sous-répertoires (par exemple dans stuff\svn_root\already_in_svn\not_in_svn.txt). D'où l'étoile à la fin.
Nux
@Nux C'est seulement maintenant après toutes ces années que je vois enfin ce que vous vouliez :) Dans la commande, le point est le chemin qui spécifie le répertoire courant. Naturellement, toute alternative valable peut être fournie à la place.
Neutrino
C'est la bonne réponse. Je ne sais pas comment une solution qui comprend l'ajout de fichiers ignorés occupe la première place. @Neutrino, suggérez de supprimer votre commentaire à joey qui n'apparaît plus sur cette page, et ajoutez également une ligne renforçant le fait que votre suggestion n'ajoute PAS de fichiers ignorés
b_levitt
35

Cela a fonctionné pour moi:

svn add `svn status . | grep "^?" | awk '{print $2}'`

( Source )

Comme vous avez déjà résolu votre problème pour Windows, il s'agit d'une solution UNIX (à la suite de Sam). J'ai ajouté ici car je pense que c'est toujours utile pour ceux qui atteignent cette question en demandant la même chose (car le titre n'inclut pas le mot-clé "WINDOWS").

Remarque (février 2015): Comme commenté par "bdrx", la commande ci-dessus pourrait être simplifiée de cette manière:

 svn add `svn status . | awk '/^[?]/{print $2}'`
lépe
la source
1
Nice, compact, concis, se prête également assez bien à l'extension. Merci.
Norman H
1
Génial. Aussi facile à développer, modifier pour supprimer, etc.
Drewid
Parfait pour ce dont j'avais besoin. Je vous remercie!
Jeff le
2
Pourquoi les gens font-ils toujours un grep puis un redirection vers awk? Awk peut faire des filtrages: awk '/^[?]/{print $2}'; Pas besoin du processus grep supplémentaire.
bdrx
1
@bdrx: Peut-être parce que grep est généralement associé à la correspondance de modèles? Dans mon cas personnel, je suis beaucoup plus expérimenté avec grep qu'avec awk. Je ne savais pas que vous pouviez faire de telles choses dans awk, donc je vais commencer à utiliser awk plus dans mes scripts. Merci!
lepe
5
svn add --force .

Cela ajoutera tout fichier non versionné dans le répertoire courant et tous les répertoires enfants versionnés.

jmc734
la source
5

Cette méthode doit gérer les noms de fichiers contenant n'importe quel nombre / combinaison d'espaces ...

svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"

Voici une explication de ce que fait cette commande:

  • Répertoriez tous les fichiers modifiés.
  • Limitez cette liste aux lignes avec '?' au début - c'est à dire de nouveaux fichiers.
  • Retirer le '?' caractère au début de la ligne.
  • Supprimez les espaces au début de la ligne.
  • Dirigez les noms de fichiers dans xargs pour exécuter le svn add plusieurs fois.

Utilisez l'argument -i de xargs pour gérer la possibilité d'importer des noms de fichiers avec des espaces dans 'svn add' - en gros, -i définit {} à utiliser comme espace réservé afin que nous puissions mettre les caractères "autour du nom de fichier utilisé par 'svn ajouter'.

Un avantage de cette méthode est qu'elle devrait gérer les noms de fichiers avec des espaces.

bailey86
la source
Cela suppose Linux ou similaire (par exemple MinGW ou Cygwin ). L'OP a déclaré: "Mon serveur exécute Windows Server 2003, donc une solution Unix ne fonctionnera pas."
Peter Mortensen
4

TortoiseSVN a cette capacité intégrée, si vous êtes prêt à utiliser une solution sans ligne de commande. Faites un clic droit sur le dossier de niveau supérieur et sélectionnez Ajouter ...

John Meagher
la source
Avec un énorme référentiel, TortoiseSVN se bloque. Cela m'a fait chercher des alternatives en ligne de commande :-)
Upendra
3

Utilisation:

svn st | grep ? | cut -d? -f2 | xargs svn add
Xiè Jìléi
la source
1
Ou vous pouvez utiliser cut pour faire le travail de grep: svn status | cut -d ? -f 2 -s | xargs svn add
Eric3
Cela suppose Linux ou similaire (par exemple MinGW ou Cygwin ). L'OP a déclaré: "Mon serveur exécute Windows Server 2003, donc une solution Unix ne fonctionnera pas."
Peter Mortensen
3

J'utilise toujours:

Copier coller

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
Oritm
la source
1
L'explicité d'opération déclare qu'une solution Unix ne lui est d'aucune utilité.
Neutrino
Cela suppose Linux ou similaire (par exemple MinGW ou Cygwin ). L'OP a déclaré: "Mon serveur exécute Windows Server 2003, donc une solution Unix ne fonctionnera pas."
Peter Mortensen
3

Puisque ce message est étiqueté Windows, j'ai pensé trouver une solution pour Windows. Je voulais automatiser le processus et j'ai créé un fichier chauve-souris. J'ai résisté à la création d'un console.exe en C #.

Je voulais ajouter des fichiers ou des dossiers qui ne sont pas ajoutés dans mon référentiel lorsque je commence le processus de validation.

Le problème avec beaucoup de réponses est qu'elles listeront les fichiers non versionnés qui devraient être ignorés selon ma liste d'ignorés dans TortoiseSVN .

Voici mon paramètre de crochet et mon fichier de commandes qui fait cela

Script de crochet de tortue:

"start_commit_hook".
(where I checkout) working copy path = C:\Projects
command line: C:\windows\system32\cmd.exe /c C:\Tools\SVN\svnadd.bat
(X) Wait for the script to finish
(X) (Optional) Hide script while running
(X) Always execute the script

svnadd.bat

@echo off

rem Iterates each line result from the command which lists files/folders
rem     not added to source control while respecting the ignore list.
FOR /F "delims==" %%G IN ('svn status ^| findstr "^?"') DO call :DoSVNAdd "%%G"
goto end

:DoSVNAdd
set addPath=%1
rem Remove line prefix formatting from svn status command output as well as
rem    quotes from the G call (as required for long folder names). Then
rem    place quotes back around the path for the SVN add call.
set addPath="%addPath:~9,-1%"
svn add %addPath%

:end
Valamas
la source
2
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"

Dans cette implémentation, vous aurez des problèmes dans le cas où vos dossiers / noms de fichiers ont plus d'un espace comme ci-dessous:

"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Sega Mega      2"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\One space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Double  space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Single"

ces cas sont couverts par de simples:

for /f "usebackq tokens=1*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%j"
Olexa
la source
2

Si vous utilisez Linux ou utilisez Cygwin ou MinGW dans Windows, vous pouvez utiliser des solutions de type bash comme les suivantes. Contrairement à d'autres similaires présentés ici, celui-ci prend en compte les espaces de noms de fichiers:

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done
ajaest
la source
À quoi ça sert? CMD? Frapper? Cela ressemble à Bash (ou à un shell similaire). Dans ce cas, il suppose Linux ou similaire (par exemple MinGW ou Cygwin ). L'OP a déclaré: "Mon serveur exécute Windows Server 2003, donc une solution Unix ne fonctionnera pas."
Peter Mortensen
Merci, vous avez raison, quand je suis sous Windows, j'utilise Cygwin avec Bash. Cependant, la déclaration "Mon serveur exécute Windows Server 2003, donc une solution Unix ne fonctionnera pas." c'est faux. Peut-être qu'il ne veut pas utiliser Cygwin ou MinGW, mais il ne s'est pas exprimé de cette façon. J'ai reformulé la réponse.
ajaest
1

Après avoir passé un certain temps à essayer de comprendre comment ajouter de manière récursive uniquement certains des fichiers, j'ai pensé qu'il serait valide de partager ce qui a fonctionné pour moi:

FOR /F %F IN ('dir /s /b /a:d') DO svn add --depth=empty "%F"
FOR /F %F IN ('dir /s /b /a *.cs *.csproj *.rpt *.xsd *.resx *.ico *.sql') DO svn add "%F"

Voici quelques explications.

La première commande ajoute tous les répertoires. La deuxième commande n'ajoute que les fichiers en fonction des modèles spécifiés.

Laissez-moi vous donner plus de détails:

  • POUR: vous savez, le contrôle de boucle.
  • / F: signifie prendre les fichiers et répertoires (pas sûr exactement).
  • % F: c'est une variable; il prendra la valeur de chacun des fichiers répertoriés à la fois; il pourrait avoir un autre nom à un caractère.
  • IN: pas besoin d'expliquer, non?
  • ('dir / s / b / a: d'): la commande DOS qui listera les répertoires; dans mon cas / s est récursif, / b ne prend que le chemin complet, / a: d signifie uniquement le répertoire; changez-le comme vous le souhaitez en gardant les parenthèses et les apostrophes.
  • ACTION: signifie que ce qui vient ensuite dans la commande est ce qui sera exécuté pour chaque répertoire
  • svn add --depth = empty: c'est le commando SVN souhaité à exécuter; la définition de profondeur signifie ajouter uniquement le répertoire et non les fichiers à l'intérieur.
  • "% F": c'est ainsi que vous utilisez la variable définie précédemment.

Dans la deuxième commande, les seules différences sont la commande dir et la commande svn, je pense que c'est assez clair.

heringer
la source
0

Vous pouvez utiliser la commande

svn add * force--

ou

svn add <directory/file name>

Si vos fichiers / répertoires ne s'ajoutent pas de manière récursive. Alors vérifiez ceci.

L'ajout récursif est la propriété par défaut . Vous pouvez voir dans le livre SVN .

Le problème peut se trouver dans votre liste d'ignorés ou dans les propriétés globales.

J'ai une solution Google issue Tracker

Vérifiez les propriétés globales pour ignorer l'étoile (*)

  • Faites un clic droit dans votre repo dans la fenêtre. Sélectionnez TortoiseSVN > Properties.
  • Voyez si vous n'avez pas de propriété svn:global-ignores with a value of *
  • Si vous avez une propriété avec, star(*)il ignorera l'ajout récursif. Supprimez donc cette propriété.

Vérifiez le modèle d'ignorer global pour ignorer l'étoile (*)

  • Faites un clic droit dans votre repo dans la fenêtre. Sélectionnez TortoiseSVN > Settings > General.
  • Voir dans Global Ignore Pattern, si vous n'avez pas défini d' étoile (*) ici.
  • Si vous avez trouvé star(*), supprimez cette propriété.

Ce gars a également expliqué pourquoi cette propriété a été ajoutée à mon projet.

La façon la plus similaire d'y parvenir est que quelqu'un a cliqué avec le bouton droit sur un fichier sans extension et sélectionné TortoiseSVN -> SVN Ignorer -> * (récursivement), puis l'a validé.

Vous pouvez consulter le journal pour voir qui a commis cette modification de propriété, découvrir ce qu'ils essayaient réellement de faire et leur demander de faire plus attention à l'avenir. :)

Khemraj
la source
0

Vous pouvez saisir la commande suivante sous Linux:

find ./ -name "*." | xargs svn add
liu zhijun
la source
0

Depuis qu'il a spécifié Windows, où awk et sed ne sont pas standard:

for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"

ou dans un fichier batch:

for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"
WLH
la source
0

C'est le moyen paresseux et dangereux de synchroniser un répertoire avec SVN, y compris de nouveaux fichiers:

svn rm --keep-local dir
svn add dir

Bien que cela puisse fonctionner à la rigueur, cela peut également avoir de graves conséquences. Par exemple, SVN perdra souvent la trace de l'historique d'un fichier.

La manière idéale de synchroniser un répertoire serait de pouvoir effectuer un diff puis d'utiliser svn patch, mais cela s'écarte des formats de la commande diff et la commande svn diff comparera les différences de répertoire de travail plutôt que les différences au niveau du système de fichiers.

jgmjgm
la source
-1

Je pense avoir fait quelque chose de similaire avec:

svn add . --recursive

mais je ne sais pas si ma mémoire est correcte ;-p

chakrit
la source
2
juste une mise à jour pour votre mémoire: svn 1.4 et 1.5 ne supportent pas --recursive comme paramètre pour svn add :)
Ludwig Wensauer