Commande SVN pour supprimer tous les fichiers manquants localement

En SVN, existe-t-il une commande que je peux utiliser pour supprimer tous les fichiers manquant localement dans un répertoire?

Ou à défaut, une manière de ne lister que les fichiers manquants (ou, dans le cas plus général, avoir le statut A, D,?, Etc.)

Si vous utilisez TortoiseSVN, effectuez simplement une vérification des modifications , sortingez par la colonne État , sélectionnez toutes les entrées marquées comme missing , cliquez avec le bouton droit pour ouvrir le menu contextuel et sélectionnez Supprimer . Enfin, engagez à publier les modifications dans le référentiel.

Si vous êtes sous Windows, mais préférez la ligne de commande et appréciez le jeu de hasard dans PowerShell, cette application unique fera l’affaire:

 svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] } 

En d’autres termes, filtrez la sortie uniquement sur les lignes contenant des fichiers manquants (indiqués par une exclamation au début de la ligne), capturez le nom de fichier associé et exécutez un svn rm sur ce nom de fichier.

(Article de blog Supprimez tous les fichiers “manquants” d’une copie de travail SVN fait quelque chose de similaire pour Unix / Linux.)

Si vous utilisez Mac ( Darwin ) ou Linux, vous pouvez diriger les sorties des commandes suivantes vers svn rm pour tous les fichiers manquants. Vous pouvez définir le répertoire de travail actuel sur le répertoire ou le sous-répertoire approprié avant de l’exécuter – selon que vous souhaitez l’exécuter dans son intégralité ou uniquement dans un sous-ensemble.

  1. Exécuter un statut svn
  2. Rechercher des lignes commençant par “!” (disparu)
  3. Imprimer le “–force” (argument svn) et la deuxième colonne (le nom du fichier) du résultat de # 2
  4. Exécuter svn rm utilisant la sortie de # 3 comme arguments

La commande complète est donc:

 svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm 

Les références:

  • Examen des champs (colonnes) avec awk
  • Utiliser xargs pour exécuter des commandes shell avec des arguments
 svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm 
  1. svn status
  2. Filtrer uniquement sur les fichiers manquants
  3. Découper le point d’exclamation
  4. Filtrer les espaces blancs à la fin
  5. Ajouter une citation en tête
  6. Ajouter un devis de fin
  7. svn remove chaque fichier

Je viens de trouver ceci, qui fait le tour, Supprimer tous les fichiers “manquants” d’une copie de travail SVN :

 svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' ) 

Merci à Paul Martin pour la version Windows.

Voici une légère modification du script afin que les fichiers Windows avec des espaces soient également pris en compte. Le fichier missing.list sera également supprimé à la fin.

J’ai enregistré ce qui suit dans svndel.bat dans mon répertoire bin SVN (défini dans mon environnement %% PATH) pour pouvoir l’appeler depuis n’importe quel dossier à l’invite de commande.

 ### svndel.bat svn status | findstr /R "^!" > missing.list for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A") del missing.list 2>NUL 

J’aime l’option PowerShell … Mais voici une autre option si vous utilisez des scripts de commandes Windows:

 svn status | findstr /R "^!" > missing.list for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A) 

Une alternative qui fonctionne sous Linux (bash) pour les fichiers à supprimer, ne contenant pas d’espaces dans le chemin:

  svn delete `svn status |  grep!  |  awk '{print $ 2}' ` 

Ce script shell examine de manière récursive les répertoires ( svn status ) de votre projet, en supprimant les fichiers manquants (comme le demande la question) et en ajoutant de nouveaux fichiers au référentiel. C’est une sorte de “stocker dans le référentiel l’instantané actuel du projet”.

 if [ $# != 1 ] then echo "usage: doSVNsnapshot.sh DIR" exit 0 fi ROOT=$1 for i in `find ${ROOT} -type d \! -path "*.svn*" ` do echo echo "--------------------------" ( cd $i ; echo $i echo "--------------------------" svn status | awk ' /^[!]/ { system("svn rm " $2) } /^[?]/ { system("svn add " $2) } ' ) echo done 

Une légère modification de la ligne de commande, qui fonctionne sous Mac OS (si possible sous Linux) et permet de traiter les fichiers avec la commande “svm sr”, comme “! M” (manquant et modifié).

Il gère les espaces dans les fichiers.

Il est basé sur une modification d’une réponse précédente:

 svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm 

Lorsque vous manipulez beaucoup de fichiers, il peut arriver que l’argument entré dans xargs devienne trop long. Je suis allé pour une implémentation plus naïve qui fonctionne dans ce cas aussi.

Ceci est pour Linux:

 #! /bin/bash # 1. get all statii in the working copy # 2. filter out only missing files # 3. cut off the status indicator (!) and only return filepaths MISSING_PATHS=$(svn status $1 | grep -E '^!' | awk '{print $2}') # iterate over filepaths for MISSING_PATH in $MISSING_PATHS; do echo $MISSING_PATH svn rm --force "$MISSING_PATH" done 

Il est effectivement possible de supprimer complètement la liste missing.list de user3689460 et de Paul Martin

 for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")