web-dev-qa-db-fra.com

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

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

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

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

168
JerSchneid

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

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

Après cela, vous pouvez vous engager:

svn commit -m 'Adding a file'
339
Ronan

Ceci est une question différente de la mienne mais il y a une réponse à cela:

svn status | grep '?' | sed 's/^.* /svn add /' | bash
67
Sam Saffron

Ce qui fonctionne 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. Celui-ci peut être remplacé par un nom ou un chemin de répertoire spécifique si vous souhaitez ajouter un répertoire différent de celui en cours.

36
Neutrino

Cela a fonctionné pour moi:

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

( La 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 arrivent à cette question en demandant la même chose (car le titre n'inclut pas le mot clé "WINDOWS").

Note (février 2015): Comme l'a commenté "bdrx", la commande ci-dessus pourrait être encore simplifiée:

 svn add `svn status . | awk '/^[?]/{print $2}'`
31
lepe

Cette méthode devrait gérer les noms de fichiers contenant un nombre/une combinaison d'espaces quelconque ...

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. 
  • Découpez les noms de fichiers dans xargs pour exécuter plusieurs fois le svn add. 

Utilisez l'argument -i de xargs pour pouvoir 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 placer les "caractères autour du nom de fichier utilisé par" ajouter'.

Un des avantages de cette méthode est qu’elle doit gérer les noms de fichiers contenant des espaces.

5
bailey86

TortoiseSVN intègre cette fonctionnalité si vous souhaitez utiliser une solution sans ligne de commande. Faites un clic droit sur le dossier de niveau supérieur et sélectionnez Ajouter ...

4
John Meagher

J'utilise toujours:

Copier coller

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
3
Oritm
svn add --force .

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

3
jmc734

Ceci est documenté sur svn book et le plus simple et fonctionne parfaitement pour moi

svn add * --force

http://svnbook.red-bean.com/fr/1.6/svn.ref.svn.c.add.html

3
Serjik

Depuis que cet article est étiqueté Windows, je pensais que je travaillerais sur 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 fichier 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'ils vont lister les fichiers sans version qui doivent être ignorés selon ma liste ignore dans TortoiseSVN .

Voici mon réglage de crochet et le fichier de commandes qui le fait

Script Tortue Crochet:

"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
3
Valamas

Utilisation:

svn st | grep ? | cut -d? -f2 | xargs svn add
3
Xiè Jìléi

Si vous utilisez Linux ou utilisez Cygwin ou MinGW dans Windows, vous pouvez utiliser des solutions similaires à celles de bash, comme suit. Contrairement aux 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
2
ajaest
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 si vos dossiers/noms de fichiers disposent de plusieurs espaces, 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"
2
olexa

Après avoir passé du temps à essayer de comprendre comment ajouter de manière récursive seulement certains 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 ajoute uniquement les fichiers en conséquence aux modèles spécifiés.

Laissez-moi vous donner plus de détails:

  • POUR: vous savez, le contrôle de la boucle.
  • / F: signifie prendre les fichiers et les répertoires (pas exactement).
  • % F: c'est une variable; il assumera la valeur de chacun des fichiers énumérés à la fois; il pourrait avoir un autre nom d'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 doit prendre uniquement le chemin complet,/a: d signifie uniquement le répertoire; changez-le selon votre souhait en gardant la parenthèse et les apostrophes.
  • DO: 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 à exécuter; la définition de la profondeur signifie d'ajouter uniquement le répertoire et pas les fichiers qu'il contient.
  • "% F": c'est ainsi que vous utilisez la variable définie précédemment.

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

1
heringer

Vous pouvez entrer la commande suivante sur Linux:

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

Depuis qu'il a spécifié Windows, awk & sed ne sont pas la norme:

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"
0
WLH

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. Ensuite, vérifiez ceci.

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

Le problème peut figurer dans votre liste de propriétés ignorées ou dans vos propriétés globales. 

J'ai la solution google issue tracker

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

  • Faites un clic droit dans votre dépôt 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(*), les ajouts récursifs seront ignorés. Alors supprimez cette propriété.

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

  • Faites un clic droit dans votre dépôt dans la fenêtre. Sélectionnez TortoiseSVN > Settings > General.
  • Voir Global Ignore Pattern, si vous n'y avez pas défini star (*).
  • 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 manière la plus similaire d’y arriver est que quelqu'un clique avec le bouton droit de la souris sur un fichier sans extension et sélectionne TortoiseSVN -> SVN Ignore -> * (récursivement), puis l’envoie. 

Vous pouvez consulter le journal pour savoir qui a commis cette modification de propriété, recherchez savoir ce qu’ils essayaient réellement de faire et leur demander d’être plus nombreux prudent à l'avenir. :)

0
Khemraj