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.)
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.)
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.
svn rm
en utilisant la sortie de # 3 comme argumentsDonc, la commande complète est:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
Références:
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
chaque fichierJe 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/^!//' )
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
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)
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}' `
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
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
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
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")
Version améliorée
Donc, la commande complète est:
svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm