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


136

अगर मेरे पास एक सबवर्सन रिपॉजिटरी की वर्किंग कॉपी है, तो क्या एक ही कमांड या टूल के साथ उस वर्किंग कॉपी में मौजूद सभी अनवीन्ड या उपेक्षित फाइलों को डिलीट करने का कोई तरीका है? अनिवार्य रूप से, मैं एसवीएन एनालॉग के लिए देख रहा हूं git clean

या तो एक कमांड लाइन या GUI समाधान (TortoiseSVN के लिए) स्वीकार्य होगा।


जवाबों:


98

TortoiseSVN का उपयोग करना:


7
अच्छी सुविधा! मुझे लिंक को पढ़ना था, हालांकि, यह पता लगाने के लिए कि यह केवल XP पर सूची दृश्य (पेड़ दृश्य नहीं) पर काम करता है - शायद आपको अपने उत्तर में इसे शामिल करना चाहिए।
निक मेयर

5
क्या svn का कमांड लाइन संस्करण (विशेष रूप से खिड़कियों पर) समान फ़ंक्शन प्रदान नहीं करता है?
BLong

3
जैसा कि किसी ने नीचे बताया है:svn cleanup --remove-unversioned --remove-ignored .
हुइ

133
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

इसकी निम्न विशेषताएं हैं:

  • नजरअंदाज और अनटैक की गई दोनों फाइलें हटा दी जाती हैं
  • यह तब भी काम करता है, जब किसी फ़ाइल नाम में व्हॉट्सएप हो (न्यूलाइन को छोड़कर, लेकिन बहुत कुछ ऐसा नहीं है जो --xmlविकल्प का उपयोग करने के अलावा हो सकता है और परिणामस्वरूप xml आउटपुट को पार्स कर सकता है )
  • यह svn statusफ़ाइल नाम से पहले अन्य स्थिति वर्णों को प्रिंट करने पर भी काम करता है (जो कि ऐसा नहीं होना चाहिए क्योंकि फाइलें ट्रैक नहीं की जाती हैं, लेकिन सिर्फ मामले में ...)
  • यह किसी भी POSIX- अनुरूप प्रणाली पर काम करना चाहिए

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

#!/bin/sh

# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1

svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
    # tell the user which file is being deleted.  use printf
    # instead of echo because different implementations of echo do
    # different things if the arguments begin with hyphens or
    # contain backslashes; the behavior of printf is consistent
    printf '%s\n' "Deleting ${f}..."
    # if rm -rf can't delete the file, something is wrong so bail
    rm -rf "${f}" || exit 1
done

2
वास्तव में मैं जो देख रहा था, वह भी linux और macOS पर एक आकर्षण की तरह काम करता है!
अमीर

क्या आपको IFS को रीसेट करने की आवश्यकता है? मैंने 'svnclean' स्क्रिप्ट बनाने के लिए नहीं चुना। इसलिए मैं सोच रहा था कि क्या यह स्क्रिप्ट के बाकी हिस्सों के लिए IFS को पेंच करेगा ...
सी। टिवेल्ट

3
@matrixugly: नहीं, आपको IFSजो पहले था उसे वापस बदलने की आवश्यकता नहीं है । जब आप ऐसा करेंगे VARNAME=value command, का काम valueकरने के लिए VARNAMEकेवल के निष्पादन के दौरान लागू होता है command(कुछ अपवाद हैं जो करने के लिए लागू नहीं है के साथ read)। देखें POSIX विनिर्देशन और इस POSIX बग रिपोर्ट अधिक जानकारी के लिए।
रिचर्ड हैनसन

@rich, इसे साझा करने के लिए धन्यवाद। कुछ साल पहले एक svn सफाई समाधान की तलाश में आया था, और कुछ खोल स्क्रिप्टिंग ज्ञान के साथ दूर चला गया! जाहिर है कि मैं इस जवाब पर थोड़ा बहुत वापस आ रहा हूं।
सी। ट्वायलट

120

मुझे पता है कि यह पुराना है, लेकिन अगर किसी और ने इस पर ठोकर खाई, तो svn समर्थन के नए संस्करण (1.9 या बाद के) --remove-unversioned, जैसेsvn cleanup . --remove-unversioned

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options


18
मेरे लिए, यह सही उत्तर है। यह एक क्रॉस-प्लेटफ़ॉर्म कमांड लाइन का उत्तर है। इसके अलावा, आप नजरअंदाज की गई फ़ाइलों को हटा सकते हैंsvn cleanup . --remove-ignored
डान एटकिंसन

1
Svn 1.6 और ऊपर में काम करता है।
13

2
कृपया इसे 1.9 में बदलें, यह भी देखें कि subversion.apache.org/docs/release-notes/1.9.html (मैंने स्थानीय रूप से कोशिश की और यह काम नहीं किया, और मैं 1.8.8 पर हूं)
ikku100

2
समस्या यह है कि यह असंबद्ध फ़ोल्डरों को नहीं हटाती है ।
Nyerguds

1
@ नीयर्ड्स: सच है, यह अन-वर्जन वाले फोल्डर को डिलीट नहीं करता है, बल्कि केवल अन-वर्जन फाइल्स को ही डिलीट करता है। क्या किसी को समाधान मिला?
धीरज सुवर्णा

42

यह ऑन्लाइनर आपकी मदद कर सकता है:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

देखभाल के साथ प्रयोग करें!


13
यह नजरअंदाज की गई फाइलों को नहीं हटाता है और अगर किसी फाइल का नाम व्हॉट्सएप है तो वह टूट जाएगा
रिचर्ड हैनेंस

1
यह भी अनदेखा की गई फ़ाइलों को नहीं हटाता है
plaisthos

4
आप svn status --no-ignoreउपेक्षित फ़ाइलों को अच्छी तरह से पकड़ने के लिए उपयोग कर सकते हैं ।
कोडोर

3
वास्तव में, मैं इसे अनदेखा फाइलों को वैकल्पिक रूप से छोड़ने के लिए एक सुविधा मानता हूं।
20

15

यानाल-यवेस फरगील्ला और जिम्पफ के जवाबों को पॉवर्सशेल का उपयोग करके संशोधित करना (लेकिन स्टैकओवरफ़्लो द्वारा मूल पोस्ट पर टिप्पणी करने की अनुमति नहीं दी जा रही है):

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

यह कैरेट ("^") को लाइन की शुरुआत को निर्दिष्ट करने के लिए जोड़ता है, जिसमें "I" अक्षर वाले सभी फाइलों के मिलान से बचा जाता है। इस कमांड को गैर-संवादात्मक और एक स्क्रिप्ट में प्रयोग करने योग्य बनाने के लिए rm के लिए -ccse और -force के झंडे भी जोड़ें।


कमांड को अंत में एक अतिरिक्त दोहरे उद्धरण की आवश्यकता होती है। मैं अभी इसे जोड़ूंगा, लेकिन संपादन में कम से कम छह अक्षर होने चाहिए।
इयान मिलर

7

एसवीएन में कई चीजें अलग-अलग तरीकों से की जा सकती हैं, जैसा कि यहां दिए गए विभिन्न कमांड लाइन के जवाबों से पता चलता है। संस्करण 1.7 के आगमन के साथ TortoiseSVN के लिए अभी तक एक और तकनीक है, जो वास्तव में, स्टीफन के जवाब की तुलना में एक महीन अनाज का प्रस्ताव प्रदान करता है, जिससे आपको अनदेखा फ़ाइलों से अलग गैर-संस्करणित फ़ाइलों का चयन करने की सुविधा मिलती है। बस TortoiseSvn >> Clean up...इस संवाद को खोलने के लिए चयन करें ।

TortoiseSVN सफाई विकल्प


7

शक्तियों के साथ:

(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm

कमांड लाइन से:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"

3
मुझे यह शुद्ध विंडोज स्क्रिप्ट पसंद है! मैं -match '[\?i]' -replace '^.{8}'इसके बजाय उपयोग करने की सलाह दूंगा, जो एक फ़ाइल नाम व्हाट्सएप से शुरू होने पर भी सही ढंग से काम करता है , और उपेक्षित फाइलों को भी हटा देता है।
जिम्प

1
जिम्पफ के सुझाए गए ट्वीक का उपयोग करना अच्छी तरह से काम करता है, लेकिन मैं एक ऐसे मामले में भाग गया, जहां मुझे एक ItemNotFoundException का सामना करना पड़ा। पता चला, svn स्थिति परिणाम सेट में केवल एक ही फ़ाइल थी। यह ट्विक उस समस्या को ठीक करता है: code@ (svn status --no-ign) -match '[\? I]' -रेप्लेस '^। {8}' | rm `। इस पोस्ट की
मैलाबंदी

1
और क्योंकि यह आपको svn में निर्देशिकाओं के लिए संकेत देगा (क्योंकि पुनरावृत्ति निर्दिष्ट नहीं की गई थी), यह एक स्क्रिप्ट में उपयोग के लिए अच्छा नहीं है। का प्रयोग करें:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber

6

यह ऑनलाइनर मेरे लिए काम करता है (रिचर्ड हैनसन के जवाब के आधार पर, जो आश्चर्यजनक रूप से रिक्त स्थान वाली फ़ाइलों के लिए काम नहीं करता है):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}

2
भी unversioned फ़ोल्डर को हटाने के जोड़ने -frके लिए rmआदेश: SVN स्थिति --no-उपेक्षा | grep '^ [I?]' | कट-सी 9- | xargs -d "\ n" -I {} rm -fr {}
डेनिस गोलोमाज़ोव

5

TortoiseSVN का उपयोग करना:

  1. वर्क कॉपी की जड़ पर राइट-क्लिक करें और TortoiseSVN का चयन करें -> "संशोधनों के लिए जांच करें"
  2. "अनदेखा फ़ाइलें दिखाएं" चुनें
  3. "टेक्स्ट स्टेटस" कॉलम के आधार पर छाँटें
  4. "गैर-संस्करणित" फ़ाइलों पर स्क्रॉल करें, अब सभी को एक साथ समूहीकृत किया गया है; उन सभी का चयन करें और राइट-क्लिक करें -> हटाएं
  5. "अनदेखा" फ़ाइलों पर स्क्रॉल करें, अब सभी एक साथ समूहीकृत हैं; उन सभी का चयन करें और राइट-क्लिक करें -> हटाएं

वास्तव में एक अच्छा और साफ समाधान नहीं है, लेकिन सबसे तेज़ तरीका मुझे (विंडोज पर) पता है।

नजरअंदाज की गई फाइलों के साथ टिप के लिए धन्यवाद।


मेरा मानना ​​है कि यह केवल गैर-संस्करणित फ़ाइलों को हटा देगा। उपेक्षित आइटम प्रभावित नहीं होंगे।
डिर्क वोल्मार

2
आपको प्रतिबद्ध संवाद का उपयोग करने की आवश्यकता नहीं है, और आप अनदेखा फ़ाइलें प्राप्त कर सकते हैं: राइट-क्लिक करें | TortoiseSVN | संशोधन के लिए जाँच करें। फिर आप 'शो इग्नोरड फाइल्स' पर क्लिक कर सकते हैं और उचित रूप से हटा सकते हैं।
PKH

4

यह अन्य उत्तरों के समान है, लेकिन वास्तव में अनदेखा की गई फाइलें (आरईएस में 'आई' पर ध्यान दें):

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`

1
यह टूट जाता है अगर एक फ़ाइल नाम में व्हॉट्सएप है
रिचर्ड हैनेंस

4

किसी ने कहा कि आप इसे विंडोज कमांड लाइन से नहीं कर सकते।

सांड।

for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I")

एक पंक्ति में करता है और एक एकल GNU उपकरण की आवश्यकता नहीं है। :)


for /f "tokens=2 delims= " %%I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%%I" & rmdir /S /Q "%%I")
डेरेन पेर्डिनास

@DarienPardinas, आपका संस्करण विशेष रूप से उपयोगी है यदि जेनकिन्स "एक्सक्यूट विंडोज बैच कमांड" में प्लग किया जाता है, जो मैंने अभी सीखा है, कमांड प्रॉम्प्ट नहीं है लेकिन बैच स्क्रिप्ट की तरह अधिक है, इसलिए जरूरत से %%ज्यादा%
jxramx

1

आप उन्हें सिर्फ SVN कमांड लाइन (GUI टूल्स के बारे में निश्चित नहीं हैं) के साथ हटा सकते हैं, यदि आप लिनक्स सिस्टम के अंतर्गत हैं तो यह मदद कर सकता है:

http://www.guyrutenberg.com/2008/01/18/delete-unversioned-files-under-svn/

अन्य (क्रूर) विधि परिवर्तन करने के लिए है, फ़ोल्डर से सभी को हटा दें और फिर से चेकआउट करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.