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.
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'
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
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.
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}'`
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:
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.
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 ...
J'utilise toujours:
Copier coller
svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
svn add --force .
Cela ajoutera tout fichier non versionné dans le répertoire actuel et tous les répertoires enfants versionnés.
Ceci est documenté sur svn book et le plus simple et fonctionne parfaitement pour moi
svn add * --force
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
Utilisation:
svn st | grep ? | cut -d? -f2 | xargs svn add
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
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"
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:
Dans la seconde commande, les seules différences sont la commande dir et la commande svn, je pense que c'est assez clair.
Vous pouvez entrer la commande suivante sur Linux:
find ./ -name "*." | xargs svn add
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"
Vous pouvez utiliser la commande
svn add * force--
ou
svn add <directory/file name>
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
TortoiseSVN > Properties
.svn:global-ignores with a value of *
star(*)
, les ajouts récursifs seront ignorés. Alors supprimez cette propriété.TortoiseSVN > Settings > General
.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. :)