सभी स्थानीय रूप से गायब फ़ाइलों को हटाने के लिए SVN कमांड


134

एसवीएन में एक कमांड है जिसका उपयोग मैं एक निर्देशिका में सभी स्थानीय रूप से लापता फ़ाइलों को हटाने के लिए कर सकता हूं?

या इसमें विफल होने पर, केवल उन फ़ाइलों को सूचीबद्ध करने का कोई तरीका जो गायब हैं (या, अधिक सामान्य मामले में, स्थिति A, D,?, आदि) हैं


1
मैं 1 कार्यशील फ़ोल्डर और 1 चेकआउट फ़ोल्डर बनाए रखता हूं। और केवल फोल्डर को वर्किंग फोल्डर से चेक आउट फोल्डर में ले जाएं। यदि कोई फ़ोल्डर जोड़ा / हटाया जाना चाहिए, तो मैं इसे मैन्युअल रूप से करता हूं और फिर फ़ाइलों को उस फ़ोल्डर में ले जाता हूं (उदाहरण के लिए नए पैकेज, पुराने पैकेज)। अधिकांश svn समस्याएँ तब होती हैं जब आप अपनी कार्यशील प्रतिलिपि पर फ़ोल्डर ले जाते हैं। यहां तक ​​कि जब आपकी वर्किंग कॉपी से लेकर चेकआउट कॉपी तक की फाइलों को कॉपी किया जाता है, तो आपको केवल फाइल्स को ही मूव करना चाहिए, फोल्डर को नहीं।
सिद्धार्थ

जवाबों:


99

यदि आप TortoiseSVN का उपयोग कर रहे हैं, तो केवल स्थिति कॉलम के आधार पर, संशोधन के लिए एक जाँच करें, चिह्नित सभी प्रविष्टियों का चयन करें , संदर्भ मेनू खोलने के लिए राइट-क्लिक करें और हटाएं चुनें । अंत में, रिपॉजिटरी में परिवर्तन प्रकाशित करने के लिए प्रतिबद्ध हैं।missing

यदि आप विंडोज पर हैं, लेकिन कमांड-लाइन पसंद करते हैं और पावरशेल में डबलिंग का आनंद लेते हैं, तो यह एक-लाइनर होगा।

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

यही है, आउटपुट को केवल उन फ़ाइलों को फ़िल्टर करना है जो लापता फ़ाइलें दिखा रहे हैं (लाइन की शुरुआत में एक विस्मयादिबोधक द्वारा चिह्नित), संबंधित फ़ाइल नाम को कैप्चर करें, और svn rmउस फ़ाइल नाम पर प्रदर्शन करें।

(ब्लॉग पोस्ट एक एसवीएन काम करने वाली कॉपी से सभी "लापता" फ़ाइलों को हटा दें , यूनिक्स / लिनक्स के लिए कुछ ऐसा ही करता है।)


क्या ग्रहण प्लगइन का उपयोग करके ग्रहण करने का एक तरीका है? यह एक परियोजना में उन्हें फिर से अद्यतन करने और उन्हें फिर से हटाने के लिए इतना बुरा है।
स्टेन

FYI करें, अगर यहाँ तोड़फोड़ पासवर्ड की आवश्यकता है तो वाक्य रचना है: svn स्टेटस --username user_name_here --password password_here | ? {$ _ -मंच '^! \ s + ((। *)'} | % {svn rm $ माचिस [1] --username user_name_here - पासवर्ड कूटशब्द_हेरो}
Jeff

निष्पादित करने से पहले क्या आपको इस लाइन के बाद पहले करना चाहिए svn up? क्योंकि फ़ाइलें svn सर्वर से बहाल हैं
पियरे

क्या यह कार्रवाई रिपॉजिटरी की फाइलों को भी हटा देगी?
सेबेस्टियन उल्लोआ

175

यदि आप मैक ( डार्विन ) या लिनक्स का उपयोग कर रहे हैं, तो आप svn rmसभी लापता फाइलों के लिए निम्न कमांड के आउटपुट को पाइप कर सकते हैं । आप इन्हें चलाने से पहले वर्तमान कार्यशील निर्देशिका को उपयुक्त निर्देशिका या उपनिर्देशिका में सेट कर सकते हैं - इस पर निर्भर करते हुए कि आप इसे अपनी पूरी कार्यशील प्रति, या केवल एक उपसमुच्चय चलाना चाहते हैं।

  1. एक svn स्थिति चलाएँ
  2. उन पंक्तियों की खोज करें जो "!" (लापता)
  3. # 2 से "--force" (svn तर्क) और आउटपुट का दूसरा कॉलम (फ़ाइल नाम) प्रिंट करें
  4. svn rmतर्क के रूप में # 3 के आउटपुट का उपयोग करके चलाएँ

तो पूरी आज्ञा है:

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

संदर्भ:


4
यदि फ़ाइल नाम में रिक्त स्थान हैं तो यह काम नहीं करता है। हालांकि, इसे ठीक करने के लिए मुझे पर्याप्त जानकारी नहीं है।
बुगलाफ़

2
का प्रयोग करें awk '{print " --force "$2"@"}'अगर आपके फ़ाइल नाम एक होता है @(उदाहरण के लिए एक iOS देव हैं)
Guillaume Algis

1
और व्हॉट्सएप (एस) के साथ एक फ़ाइल नाम को संभालना awk '{$1=""; print " --force \""substr($0,2)"@\"" }'चाहिए, चाल करना चाहिए (और बदसूरत दिखना शुरू होता है)
ग्वेलियूम अल्जीस

12
अंतरिक्ष की देखभाल करने वाला पूरा कमांड "svn st | grep ^! Awk '{$ 1 =" है; प्रिंट "--force \" "पदार्थ ($ 0,2)" @ \ ""} | xargs svn mm ”
नमस्ते

1
आप --forcexargs भाग में क्यों नहीं डालते ?
jwg

53
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. केवल गुम फाइलों पर फ़िल्टर करें
  3. विस्मयादिबोधक बिंदु काटें
  4. ट्रेलिंग व्हाट्सएप को फ़िल्टर करें
  5. अग्रणी उद्धरण जोड़ें
  6. अनुगामी उद्धरण जोड़ें
  7. svn remove प्रत्येक फ़ाइल

यह सॉल्यूशन काम करता है अगर फाइल्स / डायरेक्टरीज़ में स्पेस हो।
यरिक

इसमें क्रिया को कैसे जोड़ा जाता है? xargs -verbose svn rm?
टेकियसफैनटिकस

1
लिपियों आदि के उपयोगकर्ताओं के लिए बस एक संकेत, यह कमांड विफल हो जाती है यदि हटाने के लिए कोई फाइल नहीं मिलती है: svn: E205001: अधिक जानकारी के लिए 'svn help delete' की कोशिश करें svn: E205001: पर्याप्त तर्क उपलब्ध नहीं कराए गए
Thorsten -öning

1
@ ThorstenSchöning की समस्या -rको xargsविकल्पों में जोड़कर तय किया जा सकता है (न चलाएं, न ही तर्क दिया जाता है)। इसके अतिरिक्त, तर्कों की संख्या को सीमित किया जाना चाहिए और निष्कासन को सीमित किया जाना चाहिए क्योंकि आह्वान को हटाने के लिए बहुत बड़ी संख्या में फाइलों के साथ विफल रहता है, जैसे -n 500। और अंतिम लेकिन कम से कम नहीं, उद्धृत किए गए उद्धरण शेल विशेष युक्त फ़ाइलों के लिए उप$\nxargssvn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
रूपी है


19

विंडोज संस्करण के लिए पॉल मार्टिन का धन्यवाद।

यहाँ स्क्रिप्ट के लिए थोड़ा सा संशोधन है, इसलिए रिक्त स्थान के साथ Windows फ़ाइलों को भी ध्यान में रखा जाता है। साथ ही missing.listफाइल को अंत में हटा दिया जाएगा।

मैंने अपने SVN बिन निर्देशिका (sv %el PATH वातावरण में सेट) में svndel.bat में निम्नलिखित को सहेजा है ताकि इसे कमांड प्रॉम्प्ट पर किसी भी फ़ोल्डर से कॉल किया जा सके।

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

कुछ नवीन बैच कोड देखकर अभी भी अच्छा लगा :)
user230910

वाह, बहुत बढ़िया जवाब। मैं पावरशेल के साथ जाने वाला था, लेकिन यह इतना आसान था।
जिम एंड्राकिस

मैंने बाद में एक और लाइन जोड़ी del missing.list 2>NUL, क्योंकि मैंने हटाई गई फ़ाइलों को हटाने के बाद सीधे सभी नई फाइलें जोड़ीं, इसलिए इसने missing.listsvn में जोड़ा : svn delete "missing.list"मेरे लिए काम किया
पियरे

मैंने इस स्क्रिप्ट को एक मनमाने स्थान से चलाने का प्रयास करने के लिए संशोधित किया था, तब इस समस्या का सामना करना पड़ा stackoverflow.com/questions/1137219/… ताकि यह प्रतीत हो कि आप इस क्रिया को करने के लिए करंट वर्किंग डायरेक्टरी का उपयोग करें।
anolszowka

7

मुझे PowerShell विकल्प पसंद है ... लेकिन यदि आप Windows बैच स्क्रिप्ट का उपयोग कर रहे हैं, तो यहां एक और विकल्प है:

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

5

एक विकल्प जो लिनक्स (bash) पर काम करता है, जो रास्ते में रिक्त स्थान नहीं होने वाली फ़ाइलों को हटाने के लिए है:

svn हटाएँ `svn स्थिति | grep! | awk '{प्रिंट $ 2}' '

4

यह शेल स्क्रिप्ट, svn statusआपकी परियोजना में निर्देशिकाओं की पुनरावृत्ति ( ) निर्देशिका करता है , लापता फाइलों को हटाता है (जैसा कि प्रश्न मांग करता है) और रिपॉजिटरी में नई फाइलें जोड़ रहा है। यह "परियोजना के वर्तमान स्नैपशॉट भंडार में स्टोर" के कुछ प्रकार है।

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

4

कमांड लाइन का एक मामूली संशोधन, जो मैक ओएस पर काम करता है (उम्मीद है कि लिनक्स पर भी) और फाइलों के साथ कॉपी करता है कमांड "svm sr" रिपोर्ट, जैसे "! M" (लापता और संशोधित)।

यह फाइलों में रिक्त स्थान के साथ मुकाबला करता है।

यह पिछले उत्तर के संशोधन पर आधारित है:

svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm

4

यह वास्तव में missing.listउपयोगकर्ता3689460 और पॉल मार्टिन से पूरी तरह से हटाने के लिए संभव है

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

संदर्भ के लिए - यह विंडोज़ भूमि में DOS / cmd.exe है
user230910

2

बहुत सारी फ़ाइलों से निपटने के दौरान, ऐसा हो सकता है कि xargs के तर्क इनपुट बहुत लंबे हो रहे हैं। मैं अधिक भोली कार्यान्वयन के लिए गया जो उस मामले में भी काम करता है।

यह लिनक्स के लिए है:

#! /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

1

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

तो पूरी आज्ञा है:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.