স্থানীয়ভাবে হারিয়ে যাওয়া সমস্ত ফাইল মুছে ফেলার জন্য এসভিএন কমান্ড


133

এসভিএন-তে কোনও আদেশ আছে যা আমি কোনও ডিরেক্টরিতে স্থানীয়ভাবে অনুপস্থিত ফাইলগুলি মুছতে ব্যবহার করতে পারি?

বা এটি ব্যর্থ হয়ে, কেবলমাত্র সেই ফাইলগুলিকেই তালিকাভুক্ত করার কিছু উপায় যা অনুপস্থিত (বা আরও সাধারণ ক্ষেত্রে, এ, ডি,? ইত্যাদি স্থিতি রয়েছে)


1
আমি 1 টি কার্যকারী ফোল্ডার এবং 1 টি চেকআউট ফোল্ডার বজায় রাখছি। এবং কেবলমাত্র ফাইলগুলিকে ওয়ার্কিং ফোল্ডার থেকে চেক আউট ফোল্ডারে নিয়ে যান। যদি কোনও ফোল্ডার অবশ্যই যুক্ত করা / অপসারণ করতে হয়, আমি নিজেই এটি করি এবং তারপরে ফাইলগুলি সেই ফোল্ডারে স্থানান্তরিত করি (উদাহরণস্বরূপ নতুন প্যাকেজগুলি, পুরানো প্যাকেজগুলি)। সর্বাধিক এসএনএন সমস্যাগুলি ঘটে যখন আপনি নিজের কার্যকরী অনুলিপিতে ফোল্ডারগুলি স্থানান্তর করেন। এমনকি আপনার ওয়ার্কিং অনুলিপি থেকে চেকআউট অনুলিপিগুলিতে ফাইলগুলি অনুলিপি করার সময়, আপনার কেবল ফাইলগুলি সরানো উচিত, ফোল্ডারগুলি নয়।
সিদ্ধার্থ

উত্তর:


99

আপনি যদি টরটোইজএসভিএন ব্যবহার করে থাকেন তবে কেবল পরিবর্তনের জন্য পরীক্ষা করুন , স্থিতি কলাম অনুসারে বাছাই করুন missing, চিহ্নিত সমস্ত এন্ট্রি নির্বাচন করুন, প্রসঙ্গ মেনু খুলতে ডান ক্লিক করুন এবং মুছুন নির্বাচন করুন । অবশেষে, সংগ্রহস্থলের পরিবর্তনগুলি প্রকাশ করার প্রতিশ্রুতিবদ্ধ।

আপনি যদি উইন্ডোতে থাকেন তবে কমান্ড-লাইনটি পছন্দ করেন এবং পাওয়ারশেলের ডাবলিং উপভোগ করুন, এই ওয়ান-লাইনারটি কৌশলটি সম্পাদন করবে:

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

এটি হ'ল আউটপুটটি কেবল সেই ফাইলগুলিতে ফিল্টার করুন যা অনুপস্থিত ফাইলগুলি দেখায় (লাইনের শুরুতে একটি বিস্মৃতি দ্বারা চিহ্নিত), সম্পর্কিত ফাইলের নামটি ক্যাপচার করুন এবং svn rmসেই ফাইলটির নামের উপর একটি সম্পাদন করুন।

(ব্লগ পোস্ট এসভিএন ওয়ার্কিং কপি থেকে সমস্ত "অনুপস্থিত" ফাইলগুলি সরান ইউনিক্স / লিনাক্সের জন্য অনুরূপ কিছু করে))


সাবক্লিপ প্লাগইন ব্যবহার করে গ্রহনে কোনও উপায় আছে? কোনও আপডেট করার পরে প্রকল্পে তাদের সন্ধান করে আবার মুছে ফেলা খুব খারাপ it
স্টান

এফওয়াইআই, যদি এখানে সাবভার্সন পাসওয়ার্ডের প্রয়োজন হয় তবে সিনট্যাক্সটি রয়েছে: এসএনএন স্থিতি - ব্যবহারকারীর নাম ব্যবহারকারী_নাম - এখানে - পাসওয়ার্ডের পাসওয়ার্ড_এখানে | ? । $ _ -ম্যাচ '^! \ এস + (। *)'} | % {এসএনএন আরএম $ ম্যাচগুলি [1] - ব্যবহারকারীর নাম_র_নামা - পাসওয়ার্ডের পাসওয়ার্ড_ এখানে}
জেফ

কার্যকর করার আগে আপনার কি প্রথম এই লাইনের পরে প্রতিশ্রুতিবদ্ধ উচিত svn up? কারণ ফাইলগুলি এসএনএন সার্ভার থেকে পুনরুদ্ধার করা হয়েছে
পিয়ের

এই ক্রিয়াটি কি ভান্ডার থেকে ফাইলগুলি মুছবে?
সেবাস্তিয়ান উলোয়া

175

আপনি যদি ম্যাক ( ডারউইন ) বা লিনাক্স ব্যবহার করে svn rmথাকেন তবে সমস্ত অনুপস্থিত ফাইলের জন্য আপনি নিম্নলিখিত কমান্ডগুলির আউটপুটগুলি পাইপ করতে পারেন । এগুলি চালানোর আগে আপনি বর্তমান ওয়ার্কিং ডিরেক্টরিটিকে যথাযথ ডিরেক্টরি বা উপ-ডিরেক্টরিতে সেট করতে পারেন - আপনি এটি আপনার পুরো ওয়ার্কিং কপিটি চালাতে চান কিনা তার উপর নির্ভর করে, বা কেবল একটি উপসেট।

  1. একটি এসএনএন স্থিতি চালান
  2. "!" দিয়ে শুরু হওয়া লাইনগুলি অনুসন্ধান করুন (অনুপস্থিত)
  3. # 2 থেকে আউটপুটটির "--ফোর্স" (এসএনএন আর্গুমেন্ট) এবং দ্বিতীয় কলাম (ফাইলের নাম) মুদ্রণ করুন
  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
স্থানটির যত্ন নেওয়ার পুরো কমান্ডটি হ'ল "এসএনএন স্ট্রিট | গ্রেপ |! | Awk '{$ 1 =" "; মুদ্রণ" --ফোর্স \ "" সাবস্ট্রাস্টার ($ 0,2) "@ \" "}' | xargs এসএনএন আরএম "
হ্যালো ওয়ার্ল্ড

1
আপনি কেন --forceজার্গেজ অংশে রাখেন না ?
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 সাহায্যের ডিলিট' আরও তথ্য SVN জন্য: E205001: যথেষ্ট আর্গুমেন্ট নেই প্রদান করা
Thorsten Schöning

1
@ থারস্টেনশিংয়ের সমস্যাটি বিকল্পগুলিতে যোগ -rকরার মাধ্যমে সমাধান করা যেতে পারে xargs(চালানো হবে না, যদি না তর্ক দেওয়া হয়) are অতিরিক্তভাবে, আর্গুমেন্টগুলির সংখ্যার সীমাবদ্ধ হওয়া উচিত এবং অপসারণগুলি ব্যাচ করা উচিত কারণ উদ্বোধনটি খুব বড় সংখ্যক ফাইল মুছে ফেলার সাথে ব্যর্থ হয়, যেমন -n 500। এবং সর্বশেষে তবে সর্বনিম্ন নয়, শেল বিশেষযুক্ত ফাইলগুলির জন্য সঞ্চালিত উদ্ধৃতিটি সাব-ইস্টিমাল রয়েছে $- \nডিলিমিটার হিসাবে আরও ভাল ব্যবহার করুন এবং উদ্ধৃতিটি ছেড়ে দিন xargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
বিশেষযুক্ত উদ্ধৃতিটি সাব

29

আমি সবেমাত্র এটি পেয়েছি, যা কৌশলটি করে, একটি এসভিএন ওয়ার্কিং কপি থেকে সমস্ত "অনুপস্থিত" ফাইলগুলি সরান :

svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )

ওএস এক্স-এ আমার জন্য কাজ করা হয়েছে। ধন্যবাদ :)
গুস্তাভো দে সুজা

19

উইন্ডোজ সংস্করণের জন্য পল মার্টিনকে ধন্যবাদ।

এখানে স্ক্রিপ্টে সামান্য পরিবর্তন করা হয়েছে যাতে স্পেস সহ উইন্ডোজ ফাইলগুলিও বিবেচনায় নেওয়া হয়। এছাড়াওmissing.list ফাইলটি শেষে মুছে ফেলা হবে।

আমি নিম্নলিখিতগুলিকে আমার এসভিএন বিন ডিরেক্টরিতে svndel.bat এ সংরক্ষণ করেছি (আমার %% PATH পরিবেশে সেট করুন) যাতে কমান্ড প্রম্পটে যে কোনও ফোল্ডার থেকে কল করা যায়।

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

কিছু উদ্ভাবনী ব্যাচ কোডটি এখনও উপস্থিত
দেখায় ভালো লাগছে

বাহ, দুর্দান্ত উত্তর। আমি পাওয়ারশেলের সাথে যাব, কিন্তু এটি এত সহজ ছিল।
জিম আন্ডারাকাকিস

আমি এর পরে আর একটি লাইন যুক্ত করেছি del missing.list 2>NUL, কারণ আমি মুছে ফেলা ফাইলগুলি প্রথমে সরানোর পরে সরাসরি সমস্ত নতুন ফাইল যুক্ত করেছি যাতে এটি missing.listএসএনএন-তে যুক্ত হয়েছিল: svn delete "missing.list"আমার জন্য কাজ করেছে
পিয়ের

আমি এই স্ক্রিপ্টটি একটি স্বেচ্ছাসেবী অবস্থান থেকে চালানোর চেষ্টা করার জন্য সংশোধন করেছিলাম তখনই এই সমস্যার মুখোমুখি হয়েছিল stackoverflow.com/questions/1137219/… সুতরাং দেখা যাচ্ছে যে এই ক্রিয়াটি সম্পাদন করার জন্য আপনার বর্তমান কার্যনির্বাহী ডিরেক্টরিটি ব্যবহার করা উচিত।
আওলসোওকা

7

আমি পাওয়ারশেল বিকল্পটি পছন্দ করি ... তবে আপনি যদি উইন্ডোজ ব্যাচের স্ক্রিপ্ট ব্যবহার করেন তবে এখানে অন্য একটি বিকল্প রয়েছে:

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

5

অপসারণযোগ্য ফাইলগুলির জন্য লিনাক্সে (ব্যাশ) কাজ করে এমন একটি বিকল্প যা পথের ফাঁকে ফাঁকে সংকোচন করে না:

svn মোছা `svn অবস্থা | গ্রেপ! | 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

কমান্ড লাইনের একটি সামান্য পরিবর্তন, যা ম্যাক ওএসে (আশাবাদী এমনকি লিনাক্সেও) কাজ করে এবং "! এম" (নিখোঁজ এবং সংশোধিত) কমান্ড হিসাবে "এসভিএম এসআর" প্রতিবেদন হিসাবে ফাইলগুলি অনুলিপি করে।

এটি ফাইলগুলির ফাঁকা স্থানগুলির সাথে কপি করে।

এটি পূর্ববর্তী উত্তরের একটি পরিবর্তনের উপর ভিত্তি করে:

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")

রেফারেন্সের জন্য - এটি উইন্ডোজ জমিতে ডস /
সেমিডি.এক্সি

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.