स्वचालित रूप से तोड़फोड़ की गई न की गई फाइलों को हटा दें


111

क्या किसी को काम की प्रतिलिपि में उन सभी फ़ाइलों को पुन: हटाने का एक तरीका पता है जो संस्करण नियंत्रण में नहीं हैं? (मुझे अपने स्वचालित बिल्ड VMware में अधिक विश्वसनीय परिणाम प्राप्त करने की आवश्यकता है।)


7
मैं एक एसवीएन उपयोगकर्ता हूं और जीवीटी की तुलना एसवीएन से कर रहा हूं, यह देखने के लिए कि क्या मैं अंततः स्विच बनाना चाहता हूं। ऐसा लगता है कि यह एक और उदाहरण हो सकता है जहाँ Git अपनी "git clean" कमांड से चमकता है।
जिपरसन

3
या hg purge --allमर्क्यूरियल में।
ब्रेंडन लॉन्ग

का डुप्लीकेट stackoverflow.com/questions/2803823/... जहां एक बहुत अधिक उपयोगी गतिविधि नहीं है।
हीथ राफ्टी

जवाबों:


26

संपादित करें:

सबवर्सन 1.9.0 ने ऐसा करने का एक विकल्प पेश किया:

svn cleanup --remove-unversioned

इससे पहले, मैं यह करने के लिए इस अजगर स्क्रिप्ट का उपयोग करता हूं:

import os
import re

def removeall(path):
    if not os.path.isdir(path):
        os.remove(path)
        return
    files=os.listdir(path)
    for x in files:
        fullpath=os.path.join(path, x)
        if os.path.isfile(fullpath):
            os.remove(fullpath)
        elif os.path.isdir(fullpath):
            removeall(fullpath)
    os.rmdir(path)

unversionedRex = re.compile('^ ?[\?ID] *[1-9 ]*[a-zA-Z]* +(.*)')
for l in  os.popen('svn status --no-ignore -v').readlines():
    match = unversionedRex.match(l)
    if match: removeall(match.group(1))

यह काम बहुत अच्छी तरह से करने लगता है।


1
अभी भी मेरे लिए अजगर 2.7.2 के साथ काम करता है। वॉरेन पी: आप अधिक जानकारी प्रदाता कर सकते हैं?
थॉमस वाटरडल

मुझे लगता है कि यह सिर्फ पायथन 2.6 के साथ एक समस्या थी। 2.7 में फिर से मेरे लिए काम करता है।
वारेन पी।

1
डाउनवोट: बोलो से अन्य समाधान svn cleanup --remove-unversionedबेहतर है। और यह Subversion 1.9.0 के लिए है (यह संस्करण 2015 से है)। यह स्थिर और स्थिर है।
tres.14159

138

यह मेरे लिए काम करता है:

 svn status | egrep '^\?' | cut -c8- | xargs rm

सेठ रेनो बेहतर है:

svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r 

यह फ़ाइल नाम में असंबद्ध फ़ोल्डर और रिक्त स्थान को संभालता है

नीचे दी गई टिप्पणियों के अनुसार, यह केवल उन फाइलों पर काम करता है जो तोड़फोड़ के बारे में नहीं जानता (स्थिति =?)। कुछ भी तोड़फोड़ कि करता है (अनदेखा फ़ाइलें / फ़ोल्डर सहित) को हटाया नहीं जाएगा के बारे में पता है।

यदि आप 1.9 या अधिक तोड़फोड़ का उपयोग कर रहे हैं, तो आप केवल - क्लीनव-अनवेरेड और - वर्म-इग्नोर किए गए विकल्पों के साथ svn क्लीनअप कमांड का उपयोग कर सकते हैं।


6
साइबरविन में विंडोज में भी प्रयोग करने योग्य है।
होन्ज़ा

9
आप रिक्त स्थान के साथ फ़ाइल नाम के लिए xargs के लिए -d विकल्प को जोड़ने पर विचार कर सकते हैं और -r विकल्प किसी भी जोड़ा निर्देशिकाओं के लिए rm करने के लिए: svj स्थिति | grep ^ \? | कट -c9- | xargs -d \\ n rm -r
सेठ रेनो

4
ओएस एक्स पर चलने वाले डी-विकल्प के साथ मुझे भी समस्याएं थीं, मेरा विकल्प निम्नानुसार है, जो लाइनब्रीक को अशक्त वर्णों में अनुवाद करता है और फ़ाइल नाम में रिक्त स्थान को संभालने के लिए xargs पर -0 विकल्प का उपयोग करता है: svn स्थिति | grep ^ \? | कट -c9- | tr '\ n' '' 0 '| xargs -0 rm
ब्रायन वेबस्टर

3
यदि आप उन आदेशों पर ध्यान svn status | grep "^?" | awk '{print $2}' | xargs -d \\n rm -r
केंद्रित करते हैं

3
@Pavel xargs पर एक नज़र डालें - नहीं-रन-इफ-खाली विकल्प
Ken

71

मैं इस पृष्ठ पर एक ही कार्य करते हुए देख रहा था, हालांकि एक स्वचालित निर्माण के लिए नहीं।

थोड़ा और देखने के बाद मैंने TortoiseSVN में ' विस्तारित संदर्भ मेनू ' की खोज की । शिफ्ट कुंजी दबाए रखें और काम की प्रतिलिपि पर राइट क्लिक करें। TortoiseSVN मेनू के अंतर्गत अब अतिरिक्त विकल्प हैं जिनमें ' हटाए गए आइटम हटाएं ... ' शामिल हैं।

हालांकि शायद इस विशिष्ट प्रश्न के लिए लागू नहीं है (यानी एक स्वचालित निर्माण के संदर्भ में), मैंने सोचा कि यह दूसरों के लिए एक ही काम करने में मददगार हो सकता है।


महान! XP पर यह केवल सूची दृश्य (एक्सप्लोरर के दाईं ओर) में कार्य करता है न कि ट्री व्यू (बाईं ओर) में।
क्रिस्टोफर Oezbek

शानदार, केवल इसे रीसायकल बिन में भेजें, एक सीधे हटाने के लिए अच्छा होगा। मुझे जिस चीज की जरूरत थी।
डीन थॉमस

आप इसे TortoiseSVN के TortoiseProc.exe के साथ कमांड लाइन पर भी स्वचालित कर सकते हैं: नीचे मेरे उत्तर में विवरण।
स्टीववे_मेक


9

यदि आप विंडोज़ कमांड लाइन पर हैं,

for /f "tokens=2*" %i in ('svn status ^| find "?"') do del %i

संशोधित संस्करण:

for /f "usebackq tokens=2*" %i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%i %j"

यदि आप बैच फ़ाइल में इसका उपयोग करते हैं, तो आपको दोगुना करने की आवश्यकता है %:

for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%%i %%j"

1
इस थोड़े ने मेरे लिए काम किया। हालांकि कुछ असंबद्ध फ़ोल्डरों पर चोक करने के लिए आया था।
14

7

मैंने इसे अपनी विंडो के साथ जोड़ा है शख्सियत प्रोफाइल

function svnclean {
    svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}

2
@FelipeAlvarez हां। हाँ हम करते हैं। कटा हुआ ब्रेड के बाद से यह सबसे बड़ी बात नहीं है, लेकिन यह बैच को हरा देता है। मैं कहूंगा कि यह कम से कम बाश के रूप में उपयोगी है, शायद थोड़ा अधिक इसलिए जब से आप .NET असेंबली में खींच सकते हैं।
jpmc26

यह माइक्रोसॉफ़्ट की घृणित प्रवृत्ति से क्रियात्मकता की ओर जाता है (न केवल कमांड नाम की लंबाई में, बल्कि इंटरनेट से विशाल स्निपेट्स की नकल के बिना कुछ भी प्राप्त करने की समग्र असंभवता में), लेकिन यह चौंकाने वाला उपयोगी है, और इसके बजाय अच्छी तरह से सोचा-थ्रू।
वारेन पी।

1
आप जोड़ सकते हैं --no-ignoreकरने के लिए svn statusऔर -Recurseकरने के लिएRemove-Item
केविन स्मिथ

5

लिनक्स कमांड लाइन:

svn status --no-ignore | egrep '^[?I]' | cut -c9- | xargs -d \\n rm -r

या, यदि आपकी कुछ फाइलें रूट के स्वामित्व में हैं:

svn status --no-ignore | egrep '^[?I]' | cut -c9- | sudo xargs -d \\n rm -r

यह केन के जवाब पर आधारित है। (केन के जवाब ने फाइलों को नजरअंदाज कर दिया; मेरा जवाब उन्हें मिटा देता है)।


5

बस इसे यूनिक्स-शेल पर करें:

rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`

यदि डिलीट की जाने वाली फाइल्स की संख्या कमांड लाइन आर्ग्युमेंट्स की अधिकतम संख्या से अधिक हो तो यह काम नहीं करता। Xargs आधारित उत्तर भी देखें।
अधिकतम

4

क्या आप सिर्फ एक नए स्थान पर निर्यात नहीं कर सकते हैं और वहां से निर्माण कर सकते हैं?


1
एक स्वचालित निर्माण के लिए मैं एक साफ निर्यात चाहता हूं।
जी।

1
आदर्श रूप से, आप ऐसा करेंगे, लेकिन यह समस्याग्रस्त है यदि आपका चेकआउट बहुत बड़ा है। यही कारण है कि ओपी ने पूछा: बिल्ड को कम करने के लिए।
jpmc26

4

यदि आपके पास अपने रास्ते पर TortoiseSVN है और आप सही निर्देशिका में हैं:

TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui

विकल्प के लिए TortoiseSVN मदद में वर्णित हैं /command:cleanup:

परिणाम संवाद को पॉपअप करने से रोकने के लिए / noui का उपयोग करें या तो सफाई समाप्त होने या त्रुटि संदेश दिखाने के बारे में बताएं)। / noprogressui भी प्रगति संवाद को अक्षम करता है। / nodlg सफाई डायलॉग दिखाने में अक्षम करता है, जहां उपयोगकर्ता यह चुन सकता है कि वास्तव में सफाई में क्या किया जाना चाहिए। उपलब्ध कार्यों को स्टेटस क्लीनअप, / रिवर्ट, / डेल्यूवर्नडेड, / डेलिनगार्ड, / रिफ्रेश और / एक्सटर्नल के विकल्प / सफाई के साथ निर्दिष्ट किया जा सकता है।


4

यदि आप कछुआ svn का उपयोग कर रहे हैं तो ऐसा करने के लिए एक छिपा हुआ आदेश है। विंडोज़ एक्सप्लोरर में संदर्भ मेनू लॉन्च करने के लिए फ़ोल्डर पर राइट क्लिक करते हुए शिफ्ट होल्ड करें। आपको "हटाए गए असूचीबद्ध आइटम" कमांड मिलेगी।

विवरण के लिए इस पृष्ठ के निचले भाग को देखें, या नीचे का स्क्रीन शॉट जिसमें हरे सितारों के साथ विस्तारित विशेषताएं हैं, और पीले आयत के साथ ब्याज की एक ...

SVN विस्तारित संदर्भ मेनू बनाम मानक मेनू



3

मेरा सी # थॉमस वॉटरडेल्स पायथन लिपि का रूपांतरण:

Console.WriteLine("SVN cleaning directory {0}", directory);

Directory.SetCurrentDirectory(directory);

var psi = new ProcessStartInfo("svn.exe", "status --non-interactive");
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.WorkingDirectory = directory;

using (var process = Process.Start(psi))
{
    string line = process.StandardOutput.ReadLine();
    while (line != null)
    {
        if (line.Length > 7)
        {
            if (line[0] == '?')
            {
                string relativePath = line.Substring(7);
                Console.WriteLine(relativePath);

                string path = Path.Combine(directory, relativePath);
                if (Directory.Exists(path))
                {
                    Directory.Delete(path, true);
                }
                else if (File.Exists(path))
                {
                    File.Delete(path);
                }
            }
        }
        line = process.StandardOutput.ReadLine();
    }
}

मैं उलटा फ़ाइलों को स्थानांतरित करूँगा, बस अगर आपको बाद में कहीं उनकी आवश्यकता हो तो।
लेप्पी

एक विकास मशीन पर, निश्चित रूप से - लेकिन बिल्ड VMware में, इसका कोई मतलब नहीं होगा क्योंकि कोई भी उस पर लॉग नहीं करता है और फाइलें बनाता है।
स्टीफन शुल्त्स

धन्यवाद, मैंने इसे अपने MSBuild स्क्रिप्ट के हिस्से के रूप में क्राइसेकंट्रोल में अपने स्रोत dir को साफ करने से पहले बिल्ड करने के लिए इस्तेमाल किया
gregmac

अपने कोड के आधार पर शुरू किया और आगे एक तरीके से चला गया: github.com/tgmayfield/svn-clean-sharp/downloads
टॉम मेफील्ड

3
svn st --no-ignore  | grep '^[?I]' | sed 's/^[?I]  *//' | xargs -r -d '\n' rm -r

यह सभी फ़ाइलों को तोड़फोड़ नियंत्रण में नहीं हटाने के लिए एक यूनिक्स शेल कमांड है।

टिप्पणियाँ:

  • में st, के svn stलिए एक निर्माण में उपनाम है status, यानी कमांड के बराबर हैsvn status
  • --no-ignoreस्टेटस आउटपुट में नॉन-रिपॉजिटरी फाइल्स को भी शामिल करता है, अन्यथा .cvsignoreआदि जैसे तंत्र के माध्यम से नजरअंदाज करता है - चूंकि इस स्विच को बनाने के लिए लक्ष्य एक साफ-सुथरा शुरुआती बिंदु है
  • grepतोड़फोड़ करने के लिए फिल्टर ऐसी है कि उत्पादन केवल अज्ञात फ़ाइलें छोड़ दिया जाता है - लाइनों के साथ शुरुआत ?है कि बिना नजरअंदाज कर दिया जाएगा तोड़फोड़ करने के लिए सूची फ़ाइलें अज्ञात --no-ignoreविकल्प
  • फ़ाइल नाम तक उपसर्ग के माध्यम से हटा दिया जाता है sed
  • xargsआदेश के माध्यम से निर्देश दिया जाता है -rपर अमल नहीं करने के लिए rm, जब तर्क सूची खाली होगा
  • -d '\n'विकल्प बताता है xargsके रूप में इस तरह के सीमांकक आदेश भी रिक्त स्थान के साथ फ़ाइल नामों के लिए काम करता है एक नई पंक्ति का उपयोग करने के
  • rm -r पूर्ण निर्देशिकाओं में उपयोग किया जाता है (जो कि भंडार का हिस्सा नहीं हैं) को हटाने की आवश्यकता है

2

मुझे अतिरिक्त निर्भरता के बिना काम करने के लिए उपरोक्त में से कोई भी नहीं मिल सकता है जिसे मैं win32 पर अपने स्वचालित निर्माण प्रणाली में जोड़ना नहीं चाहता था। इसलिए मैंने निम्नलिखित चींटी कमांड्स को एक साथ रखा - ध्यान दें कि इनमें एंट-कॉन्ट्रिब JAR की आवश्यकता होती है (मैं संस्करण 1.0b3 का उपयोग कर रहा था, नवीनतम चींटी 1.7.0 के साथ)।

ध्यान दें कि यह बिना किसी चेतावनी के सभी असंबद्ध फ़ाइलों को हटा देता है।

  <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
  <taskdef name="for" classname="net.sf.antcontrib.logic.ForTask" />

  <macrodef name="svnExecToProperty">
    <attribute name="params" />
    <attribute name="outputProperty" />
    <sequential>
      <echo message="Executing Subversion command:" />
      <echo message="  svn @{params}" />
      <exec executable="cmd.exe" failonerror="true"
            outputproperty="@{outputProperty}">
        <arg line="/c svn @{params}" />
      </exec>
    </sequential>
  </macrodef>

  <!-- Deletes all unversioned files without warning from the 
       basedir and all subfolders -->
  <target name="!deleteAllUnversionedFiles">
    <svnExecToProperty params="status &quot;${basedir}&quot;" 
                       outputProperty="status" />
    <echo message="Deleting any unversioned files:" />
    <for list="${status}" param="p" delimiter="&#x0a;" trim="true">
      <sequential>
        <if>
          <matches pattern="\?\s+.*" string="@{p}" />
          <then>
            <propertyregex property="f" override="true" input="@{p}" 
                           regexp="\?\s+(.*)" select="\1" />
            <delete file="${f}" failonerror="true" />
          </then>
        </if>
      </sequential>
    </for>
    <echo message="Done." />
  </target>

एक अलग फ़ोल्डर के लिए, ${basedir}संदर्भ बदलें ।


1
नोट: केवल हटाए गए फ़ाइलों को हटा देता है; खाली unversioned फ़ोल्डरों को नहीं हटाता है।

2
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'

यदि यह सुनिश्चित हो कि आप क्या करना चाहते हैं, तो प्रतिध्वनि को हटा दें।


1
यह xargs आधारित उत्तरों से हीन है क्योंकि n हटाई जाने वाली फ़ाइलों के लिए n /bin/shऔर n rmप्रक्रियाएँ हैं।
मैक्सक्लेपजिग

माना। Xargs जानकारी के लिए धन्यवाद।
आरिया

2

चूंकि हर कोई इसे कर रहा है ...

svn status | grep ^? | awk '{print $2}' | sed 's/^/.\//g' | xargs rm -R

1

साथ ही एक और विकल्प का योगदान कर सकते हैं

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(Configpg.ini)/ मेरे अपने उद्देश्यों के लिए है।

और svn कमांड को जोड़ने के लिए एक अच्छा विचार हो सकता है



1

शुद्ध खिड़कियां cmd ​​/ बैट समाधान:

@echo off

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
if "%1"=="%~nx0" goto :eof
IF EXIST "%1\*" ( 
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof

दरअसल इस स्क्रिप्ट ने मेरी फाइलों को डिलीट नहीं किया। शायद इसमें रिक्त स्थान के कारण। @SukeshNambiar द्वारा एक-पंक्ति के जवाब ने काम किया।
क्रिस्टियान वेस्टरबेक

1

मैंने इस जवाब से सेठ रेनो के संस्करण की कोशिश की है, लेकिन यह मेरे लिए काम नहीं किया। मैं फ़ाइल नाम से पहले 8 अक्षर था, 9 में इस्तेमाल नहीं कियाcut -c9-

तो sedइसके बजाय यह मेरा संस्करण है cut:

svn status | grep ^\? | sed -e 's/\?\s*//g' | xargs -d \\n rm -r

1

यदि आप पॉवरशेल से शांत हैं:

svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path .\ $_.Replace("?","").Trim()) -WhatIf }

कमांड को वास्तव में डिलीट करने के लिए -WhatIf फ्लैग को बाहर निकालें। अन्यथा यह सिर्फ उत्पादन होगा अगर यह क्या करता है -WhatIf के बिना चलाते हैं।


1

मैं इसे थॉमस वात्सल के उत्तर के लिए एक टिप्पणी के रूप में जोड़ूंगा , लेकिन अभी तक नहीं।

इसके साथ एक छोटी सी समस्या (जो विंडोज को प्रभावित नहीं करेगी) यह है कि यह केवल फाइलों या निर्देशिकाओं के लिए जाँच करता है। यूनिक्स जैसी प्रणालियों के लिए जहां प्रतीकात्मक लिंक मौजूद हो सकते हैं, लाइन को बदलना आवश्यक है:

if os.path.isfile(fullpath):

सेवा

if os.path.isfile(fullpath) or os.path.islink(fullpath):

लिंक हटाने के लिए।

मेरे लिए, अंतिम पंक्ति को if match: removeall(match.group(1))में बदलना

    if match:
        print "Removing " + match.group(1)
        removeall(match.group(1))

ताकि यह प्रदर्शित हो कि यह क्या हटा रहा है उपयोगी था।

उपयोग के मामले के आधार पर, ?[\?ID]नियमित अभिव्यक्ति का हिस्सा बेहतर हो सकता है ?[\?I], क्योंकि Dयह हटाए गए फ़ाइलों को भी हटाता है, जो संस्करण नियंत्रण में थे। मैं इसे एक साफ, चेक किए गए फ़ोल्डर में बनाने के लिए उपयोग करना चाहता हूं, इसलिए एक Dराज्य में कोई फाइल नहीं होनी चाहिए ।


1

@ झोउफ़ेई मैं आपके जवाब का परीक्षण किया है और यहाँ अद्यतन संस्करण है:

FOR /F "tokens=1* delims= " %%G IN ('svn st %~1 ^| findstr "^?"') DO del /s /f /q "%%H"
FOR /F "tokens=1* delims= " %%G IN ('svn st %~1 ^| findstr "^?"') DO rd /s /q "%%H"
  • आपको %G और H के सामने दो निशान का उपयोग करना चाहिए
  • ऑर्डर स्विच करें: पहले सभी फाइलों को हटा दें, फिर सभी निर्देशिकाओं को हटा दें
  • (वैकल्पिक :) के स्थान पर %~1किसी भी निर्देशिका नाम का उपयोग किया जा सकता है, मैंने इसे एक बैट फ़ाइल में एक फ़ंक्शन के रूप में उपयोग किया है, इसलिए %~1पहला इनपुट पैरामटर है

0

यदि आप कोई भी कोड नहीं लिखना चाहते हैं, तो svn2svn से svn2.exe ऐसा करता है, यह भी एक लेख है कि यह कैसे लागू किया जाता है। हटाए गए फ़ोल्डर और फ़ाइलों को रीसायकल बिन में डाल दिया जाता है।

"Svn2.exe सिंक [पथ]" चलाएं।


0

उन लोगों के लिए जो अजगर, यूनिक्स खोल, जावा, आदि के बजाय पर्ल के साथ ऐसा करना पसंद करते हैं। इसके अलावा एक छोटी सी पर्ल स्क्रिप्ट है जो जिब को भी करती है।

नोट: यह भी सभी अप्रकाशित निर्देशिकाओं को हटा देता है

#!perl

use strict;

sub main()

{

    my @unversioned_list = `svn status`;

    foreach my $line (@unversioned_list)

    {

        chomp($line);

        #print "STAT: $line\n";

        if ($line =~/^\?\s*(.*)$/)

        {

            #print "Must remove $1\n";

            unlink($1);

            rmdir($1);

        }

    }

}

main();

0

TortoiseSVN का उपयोग करना: * शिफ्ट-की को दबाए रखते हुए काम करने वाले फ़ोल्डर पर राइट-क्लिक करें * "अनवांटेड आइटम हटाएं" चुनें

मैं अपनी कार्यशील प्रतिलिपि में सभी असूचीबद्ध / उपेक्षित फ़ाइलों / फ़ोल्डरों को कैसे हटा सकता हूं?


0

PERL में ऐसा करने का एक साफ तरीका होगा:

#!/usr/bin/perl
use IO::CaptureOutput 'capture_exec'

my $command = sprintf ("svn status --no-ignore | grep '^?' | sed -n 's/^\?//p'");

my ( $stdout, $stderr, $success, $exit_code ) = capture_exec ( $command );
my @listOfFiles = split ( ' ', $stdout );

foreach my $file ( @listOfFiles )
{ # foreach ()
    $command = sprintf ("rm -rf %s", $file);
    ( $stdout, $stderr, $success, $exit_code ) = capture_exec ( $command );
} # foreach ()

0

इसे बनाने के लिए मैंने ~ 3 घंटे का उपयोग किया। यूनिक्स में इसे करने के लिए 5 मिनट लगेंगे। मुख्य मुद्दे थे: विन फ़ोल्डरों के लिए नाम में रिक्त स्थान, %% i को संपादित करने की असंभवता और विन सेमीफाइनल लूप में वार्निंग को परिभाषित करने की समस्या।

setlocal enabledelayedexpansion

for /f "skip=1 tokens=2* delims==" %%i in ('svn status --no-ignore --xml ^| findstr /r "path"') do (
@set j=%%i
@rd /s /q !j:~0,-1!
)

0

C # कोड स्निपेट ऊपर मेरे लिए काम नहीं किया - मेरे पास कछुआ svn ग्राहक है, और लाइनों को थोड़ा अलग तरीके से स्वरूपित किया गया है। यहाँ ऊपर के समान कोड स्निपेट है, केवल regex को कार्य करने और उपयोग करने के लिए फिर से लिखा गया है।

        /// <summary>
    /// Cleans up svn folder by removing non committed files and folders.
    /// </summary>
    void CleanSvnFolder( string folder )
    {
        Directory.SetCurrentDirectory(folder);

        var psi = new ProcessStartInfo("svn.exe", "status --non-interactive");
        psi.UseShellExecute = false;
        psi.RedirectStandardOutput = true;
        psi.WorkingDirectory = folder;
        psi.CreateNoWindow = true;

        using (var process = Process.Start(psi))
        {
            string line = process.StandardOutput.ReadLine();
            while (line != null)
            {
                var m = Regex.Match(line, "\\? +(.*)");

                if( m.Groups.Count >= 2 )
                {
                    string relativePath = m.Groups[1].ToString();

                    string path = Path.Combine(folder, relativePath);
                    if (Directory.Exists(path))
                    {
                        Directory.Delete(path, true);
                    }
                    else if (File.Exists(path))
                    {
                        File.Delete(path);
                    }
                }
                line = process.StandardOutput.ReadLine();
            }
        }
    } //CleanSvnFolder
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.