Commande SVN pour supprimer tous les fichiers manquants localement

134

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

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

où rhys
la source
1
Je maintiens 1 dossier de travail et 1 dossier d'extraction. Et ne déplacez que les fichiers du dossier de travail vers le dossier d'extraction. Si un dossier doit être ajouté / supprimé, je le fais manuellement, puis je déplace les fichiers dans ce dossier (par exemple, les nouveaux packages, les anciens packages). La plupart des problèmes svn se produisent lorsque vous déplacez des dossiers sur votre copie de travail. Même lorsque vous copiez des fichiers de votre copie de travail vers une copie d'extraction, vous ne devez déplacer que des fichiers, pas des dossiers.
Siddharth

Réponses:

99

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

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

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

Autrement dit, filtrez la sortie uniquement sur les lignes affichant les fichiers manquants (signalées par une exclamation au début de la ligne), capturez le nom de fichier associé et effectuez un svn rmsur ce nom de fichier.

(Article de blog Supprimer tous les fichiers «manquants» d'une copie de travail SVN fait quelque chose de similaire pour Unix / Linux.)

Michael Sorens
la source
y a-t-il un moyen d'éclipse en utilisant le plugin subclipse? il est si mauvais de mettre à jour un puis de les trouver dans le projet et de les supprimer à nouveau.
Stan
Pour info, si un mot de passe subversion est nécessaire, voici la syntaxe: svn status --username user_name_here --password password_here | ? {$ _ -match '^! \ s + (. *)'} | % {svn rm $ Matches [1] --username user_name_here - password password_here}
Jeff
devriez-vous d'abord vous engager après cette ligne avant de l'exécuter svn up? car les fichiers sont restaurés à partir du serveur svn
Pierre
Cette action supprimera-t-elle également les fichiers du référentiel?
Sebastián Ulloa
176

Si vous utilisez Mac ( Darwin ) ou Linux, vous pouvez diriger les sorties des commandes suivantes vers svn rmtous 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 les exécuter, selon que vous souhaitez exécuter cette copie de travail entière ou seulement 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écuter en svn rmutilisant la sortie de # 3 comme arguments

La commande complète est donc:

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

Références:

Peter Ajtai
la source
4
Cela ne fonctionne pas s'il y a des espaces dans le nom de fichier. Cependant, je n'en connais pas assez pour le réparer.
bugloaf
2
À utiliser awk '{print " --force "$2"@"}'si votre nom de fichier contient un @(si vous êtes un développeur iOS par exemple)
Guillaume Algis
1
Et gérer un nom de fichier avec des espaces (s), awk '{$1=""; print " --force \""substr($0,2)"@\"" }'devrait faire l'affaire (et commence à avoir l'air moche)
Guillaume Algis
12
La commande complète prenant soin de l'espace est "svn st | grep ^! | Awk '{$ 1 =" "; print" --force \ "" substr ($ 0,2) "@ \" "}' | xargs svn rm "
HelloWorld
1
Pourquoi ne pas mettre le --forcedans la partie xargs?
jwg
53
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 de fin
  5. Ajouter une citation principale
  6. Ajouter un devis de fin
  7. svn remove chaque fichier
Ivrin
la source
Cette solution fonctionne s'il y a des espaces dans les fichiers / répertoires.
yuric le
Comment ajouter de la verbosité à cela? xargs -verbose svn rm?
TekiusFanatikus
1
Juste un indice pour les utilisateurs de scripts, etc., cette commande échoue si aucun fichier à supprimer n'est trouvé: svn: E205001: Essayez 'svn help delete' pour plus d'informations svn: E205001: Pas assez d'arguments fournis
Thorsten Schöning
1
Le problème de @ ThorstenSchöning peut être résolu en ajoutant -raux xargsoptions (ne pas exécuter, si aucun argument n'est donné). De plus, le nombre d'arguments doit être limité et les suppressions doivent être groupées car l'appel échoue avec un très grand nombre de fichiers à supprimer, par exemple -n 500. Et le dernier mais non le moindre, la citation effectuée est sous-optimale pour les fichiers contenant des spéciaux du shell comme $- mieux utiliser \ncomme délimiteur et laisser les guillemets à xargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
haui
19

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 missing.listfichier 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) afin qu'il puisse être appelé à partir de 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
user3689460
la source
agréable de voir du code de lot innovant encore apparaître :)
user230910
Wow, bonne réponse. J'étais sur le point de partir avec PowerShell, mais c'était tellement plus facile.
Jim Andrakakis le
J'ai ajouté une autre ligne après del missing.list 2>NUL, car j'ai ajouté tous les nouveaux fichiers directement après la première suppression des fichiers supprimés, donc il a été ajouté missing.listà svn: a svn delete "missing.list"fonctionné pour moi
Pierre
J'avais modifié ce script pour tenter de l'exécuter à partir d'un emplacement arbitraire puis j'ai rencontré ce problème stackoverflow.com/questions/1137219/… donc il semble que vous DEVEZ utiliser le répertoire de travail actuel pour effectuer cette action.
aolszowka
7

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

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

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

svn supprimer `svn status | grep! | awk '{print $ 2}' `
Gilyen
la source
4

Ce script shell examine de manière récursive ( svn status) les répertoires de votre projet, supprimant les fichiers manquants (comme l'exige la question) et ajoutant de nouveaux fichiers au référentiel. Il s'agit d'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
cibercitoyen1
la source
4

Une légère modification de la ligne de commande, qui fonctionne sur Mac OS (espérons-le même sous Linux) et gère les fichiers que la commande "svm sr" rapporte, comme "! M" (manquant et modifié).

Il fait face aux 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
Stefano Bossi
la source
4

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

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
Amfasis
la source
pour référence - il s'agit de DOS / cmd.exe dans Windows Land
user230910
2

Lorsqu'il s'agit d'un grand nombre de fichiers, il peut arriver que l'argument entré dans xargs devienne trop long. J'ai opté pour une implémentation plus naïve qui fonctionne également dans ce cas.

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
Jonas Eberle
la source
1

Version améliorée

La commande complète est donc:

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