web-dev-qa-db-fra.com

Commande SVN pour supprimer tous les fichiers manquants localement

Dans SVN, y a-t-il une commande que je peux utiliser pour supprimer tous les fichiers manquants localement dans un répertoire?

Ou, à défaut, une façon de ne répertorier que les fichiers manquants (ou, dans le cas plus général, de statut A, D,?, Etc.)

120
wheresrhys

Si vous utilisez TortoiseSVN, faites simplement un Vérifier les modifications, triez-le en fonction de la colonne Status, sélectionnez toutes les entrées marquées missing, cliquez avec le bouton droit de la souris pour ouvrir le menu contextuel, puis sélectionnez Supprimer. . Enfin, engagez-vous à publier les modifications dans le référentiel.

Si vous êtes sous Windows, mais préférez la ligne de commande et aimez vous mêler de PowerShell, ce one-liner fera l'affaire:

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

Autrement dit, filtrez la sortie uniquement sur les lignes contenant les fichiers manquants (marquées par un point d'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 Supprimer tous les fichiers «manquants» d'une copie de travail SVN a une action similaire pour Unix/Linux.)

88
Michael Sorens

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 en cours sur le répertoire ou le sous-répertoire approprié avant de les exécuter, selon que vous souhaitiez exécuter la totalité de votre copie de travail ou uniquement un sous-ensemble.

  1. Exécuter un statut svn
  2. Recherchez les lignes commençant par "!" (manquant)
  3. Affiche le "--force" (argument svn) et la deuxième colonne (le nom du fichier) de la sortie de # 2
  4. Exécutez svn rm en utilisant la sortie de # 3 comme arguments

Donc, la commande complète est:

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

Références:

158
Peter Ajtai
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 à la fin
  5. Ajouter une citation principale
  6. Ajouter une citation finale
  7. svn remove chaque fichier
47
ivrin

Je viens de trouver ceci, ce qui fait l'affaire, Supprimer tous les fichiers "manquants" d'une copie de travail SVN :

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

Merci à Paul Martin pour la version Windows.

Voici une légère modification du script pour que les fichiers Windows contenant des espaces soient également pris en compte. De plus, le fichier missing.list sera supprimé à la fin.

J'ai enregistré les éléments suivants dans svndel.bat dans mon répertoire bin SVN (défini dans mon environnement %% PATH) afin de pouvoir l'appel à partir de tout dossier de la commande Invite.

### 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
15
user3689460

J'aime l'option PowerShell ... Mais voici une autre option si vous utilisez des scripts batch de Windows:

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

Une alternative fonctionnant sous Linux (bash) pour les fichiers à supprimer ne contenant pas d'espaces dans le chemin:

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

Ce script Shell examine de manière récursive (svn status) les répertoires de votre projet, supprimant les fichiers manquants (selon les exigences de la question) et 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
3
cibercitizen1

Une légère modification de la ligne de commande, qui fonctionne sous Mac OS (même sous Linux) et gère avec les fichiers la commande "svm sr", telle que "! 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
3
Stefano Bossi

Lorsque vous traitez beaucoup de fichiers, il peut arriver que l'argument de xargs soit 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
2
Jonas Eberle

Il est en fait possible de supprimer complètement le missing.list de user3689460 et Paul Martin

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

Version améliorée

Donc, la commande complète est:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
0
Zeta