মুছে ফেলা ফাইলের ইতিহাস পরীক্ষা করা


159

যদি আমি সাবভার্শনে কোনও ফাইল মুছতে পারি, তবে আমি কীভাবে এর ইতিহাস এবং বিষয়বস্তুগুলিতে নজর দিতে পারি? যদি আমি চেষ্টা করতে svn catবা svn logঅস্তিত্বহীন ফাইলটিতে থাকি তবে এটি অভিযোগ করে যে ফাইলটি নেই।

এছাড়াও, আমি যদি ফাইলটি পুনরুত্থিত করতে চাইতাম তবে আমি কি কেবল svn addএটি ফিরিয়ে আনব?

(আমি সাবভারশন সম্পর্কে বিশেষভাবে জিজ্ঞাসা করেছি, তবে বাজার, মার্কুরিয়াল এবং গিট কীভাবে এই মামলা পরিচালনা করে তাও আমি শুনতে চাই))

উত্তর:


84

মুছে ফেলা ফাইলটির লগ পেতে, ব্যবহার করুন

svn log -r lastrevisionthefileexisted

আপনি যদি ফাইলটি পুনরুত্থিত করতে চান এবং এর সংস্করণ ইতিহাস রাখতে চান তবে ব্যবহার করুন

svn copy url/of/file@lastrevisionthefileexisted -r lastrevisionthefileexisted path/to/workingcopy/file

আপনি যদি কেবল ফাইলের সামগ্রী চান তবে পরিবর্তিত (যেমন, দ্রুত তদন্তের জন্য) চান তবে ব্যবহার করুন

svn cat url/of/file@lastrevisionthefileexisted -r latrevisionthefileexisted > file

যাই হোক না কেন, মুছে ফেলা ফাইলটি ফিরে পেতে 'এসএনএন আপ' ব্যবহার করবেন না!


2
আপনি যে সংস্করণটি মুছে ফেলেছিলেন তার বিপরীত সংশ্লেষ করে আপনি ফাইলটি পুনঃসূত্রিত করতে পারেন। এটি এসভিএন ডক্সে প্রস্তাবিত পদ্ধতি। "এসএনএন আপ" ব্যবহার করার ক্ষেত্রে, এটি "এটি করবেন না" তেমন কিছু নয় যেমন এটি "এটি আপনি যা করতে চান তা করবে না"।
rmeador

5
আমি কীভাবে ফাইলটির পুরো ইতিহাস দেখতে পারি?
বেঞ্জামিন পিটারসন

71
সরল: '-v' স্যুইচ দিয়ে প্যারেন্ট ফোল্ডারের জন্য লগটি দেখান: আপনি প্রতিটি প্রবেশের জন্য পরিবর্তিত পাথের একটি তালিকা পাবেন। সামনে 'ডি' দিয়ে একটি এবং আপনার মোছা ফাইলটির নাম সন্ধান করুন। ফাইলটি মুছে ফেলা হয়েছে এটিই পুনর্বিবেচনা।
স্টিফান

8
এটি মুছে ফেলা ফাইলগুলির জন্য কাজ করে বলে মনে হচ্ছে না। আমি যদি এটি চেষ্টা করে দেখি তবে আমি এই ত্রুটি বার্তাটি পেয়েছি: এসএনএন বিড়াল [url] /trunk/incolve/syeka/poster_funk.incl.php -r 50> আউট.টেক্সট এসএনএন: '/ প্রশাসক /! এসএনএন / বিসি / 131 / ট্রাঙ্ক / অন্তর্ভুক্ত / সাইয়েকা / পোস্টার_ফঙ্ক.আইএনএলপিএফপি'র পথ খুঁজে পাওয়া যায় নি একটি কার্যনির্বাহী সমাধানের জন্য @ বার্ট হুজেনের প্রতিক্রিয়াটি এই থ্রেডটিতে আরও দেখুন।
কিথ পামার জুনিয়র

2
আমার যদি 100,000 কমিটের সাথে একটি রেপো থাকে তবে "লাস্টরিভিশনটিফিলেক্সিস্টেড" সন্ধান করা সহজ নয়!
জন ওয়াট

151

আপনি যখন পুরানো ফাইলগুলি দেখতে চান তখন আপনার মধ্যে সত্যিকারের পার্থক্যটি জানা উচিত:

svn cat http://server/svn/project/file -r 1234

এবং

svn cat http://server/svn/project/file@1234

পাথ প্রথম সংস্করণ সৌন্দর্য যে এখন হিসাবে উপলব্ধ HTTP: // সার্ভার / SVN / প্রকল্প / ফাইল এবং আহরণ যে ফাইল যেমন সংস্করণ 1234. ছিল (তাই এই সিনট্যাক্স করে না একটি ফাইল মুছে ফেলার পরে কাজ)।

দ্বিতীয় বাক্য গঠনটি সেই ফাইলটি পায় যা http: // সার্ভার / এসএনএন / প্রকল্প / ফাইল হিসাবে উপলব্ধ ছিল 1234 সংশোধনীতে সুতরাং এই বাক্য গঠনটি মুছে ফেলা ফাইলগুলিতে কাজ করে।

এমনকি আপনি এই পদ্ধতিগুলি একত্রিত করতে পারেন যে ফাইলটি পুনর্বিবেচনার জন্য 2345 সংশোধনীতে HTTP: // সার্ভার / এসএনএন / প্রকল্প / ফাইল হিসাবে পাওয়া গিয়েছিল তবে সামগ্রীতে 1234 এ যেমন রয়েছে:

svn cat http://server/svn/project/file@2345 -r 1234

7
গাহ, ধন্যবাদ! এই থ্রেডের বর্তমান শীর্ষ প্রতিক্রিয়া এটি উল্লেখ করে না, এটি দুর্দান্ত!
কিথ পামার জুনিয়র

এটি এখনও আমার পক্ষে ব্যর্থ হয় যদি না আমি নিখুঁত পাথ ব্যবহার করি, যেহেতু আমার স্থানীয় এসএনএন ক্লায়েন্ট ./local/fileযখন ./localডিরেক্টরিটি উপস্থিত ছিল না তখন সমাধান করতে অক্ষম হয়ে ত্রুটি দিচ্ছিল । এটি এসভিএন এর নতুন সংস্করণগুলির জন্য সমস্যা নাও হতে পারে।
ডেরিক রাইস

2
@ ডেরিক্রাইস: সেক্ষেত্রে ^স্বরলিপিটি সহজেই আসে: এটি সঞ্চারিত শিকড়কে বোঝায় তাই আপনি বলতে পারেন svn cat ^/local/file@REV(সংগ্রহশালা এবং ইউআরএলের মধ্যে দূরত্বের উপর নির্ভর করে)।
মুশিফিল

এটি নীতিগতভাবে দুর্দান্ত কাজ করে। ফোল্ডারগুলির জন্য আমি নিম্নলিখিতগুলি পেয়েছি:svn: E200009: Could not cat all targets because some targets are directories
বার্নি

এটি সেরা উত্তর। সবচেয়ে বেশি ভোটও রয়েছে।
ফিলিপ আলভারেজ

94

প্রথমে ফাইলটি মুছে ফেলা হয়েছে এমন সংশোধন নম্বরটি সন্ধান করুন:

svn log -v > log.txt

তারপরে লাইনটির জন্য log.txt (কোনও এসভিএন গুরু নয়, তাই এর চেয়ে ভাল উপায় আমি জানি না) দেখুন

D <deleted file>

এবং দেখুন যে সংশোধন ছিল। তারপরে, অন্যান্য উত্তরের মতো, পূর্ববর্তী সংস্করণটি ব্যবহার করে ফাইলটিকে পুনরায় জীবিত করুন।


22
svn লগ-ভি | গ্রেপ ডি "ফাইল.নাম"
আবাতিশ্বেভ

18
প্রশ্নের সঠিক উত্তর দেওয়ার জন্য প্রথম ব্যক্তি হওয়ার জন্য +1। আপনি যদি বিষয়বস্তুটি মুছে ফেলার আগে পুনর্বিবেচনাটি না জানেন তবে আপনি এটি দেখতে পারবেন না।
সেরিন

8
@ বাতিশচেভ এটি মুছে ফেলা ফাইলগুলির তালিকা অর্জন করে তবে পুনর্বিবেচনার তথ্যটি বাতিল করে দেয়, সুতরাং এটি কার্যকর নয়। এছাড়াও আপনি ধীরে ধীরে পরিবর্তন ইতিহাসের সাথে যদি একটি বৃহত / পুরানো সংগ্রহস্থল নিয়ে কাজ করছেন তবে এটি ধীর গতির।
tchen

4
@ অব্যাশচেভের উন্নতির সাথে ভাল, দুর্দান্ত। টিচেন: গ্রেপ করার জন্য সহজেই একটি -B50 বা যুক্তি ব্যবহার করে ঠিক করা হয়েছে, আমার উত্তর দেখুন।
জোনাস বাইস্টর্ম

2
খুব বড় / পুরানো সংগ্রহস্থলের জন্য এসএনএন লগ-ভি আউটপুট সীমাবদ্ধ করার আরেকটি ভাল উপায় হ'ল -l বিকল্প। সুতরাং আপনি svn লগ -v -l 100 | ব্যবহার করতে পারেন গ্রেপ ডি "ফাইল.নাম"
মানচিত্রে

27

এটি গিট বিশেষভাবে কিছুই। আপনি যদি ফাইলটির নাম জানেন তবে লগ সহ এটি মুছে ফেলা পরিবর্তনটি সন্ধান করতে পারেন:

git log -n 1 -- filename

তারপরে আপনি সেই প্রতিশ্রুতিটি ফাইলটি মুছার আগে যেমন বিদ্যমান ছিল তা পেতে ব্যবহার করতে পারেন।

git checkout [last_revision]^ filename

উদাহরণ:

dhcp-120:/tmp/slosh 587% ls -l slosh.tac
ls: slosh.tac: No such file or directory
dhcp-120:/tmp/slosh 588% git log -n 1 -- slosh.tac
commit 8d4a1f1a94e4aa37c1cb9d329a140d08eec1b587
Author: Dustin Sallings <dustin@spy.net>
Date:   Mon Dec 15 11:25:00 2008 -0800

    Get rid of a .conf and replace it with .tac.
dhcp-120:/tmp/slosh 589% git checkout 8d4a1f^ slosh.tac
dhcp-120:/tmp/slosh 590% ll slosh.tac
-rw-------  1 dustin  wheel  822 Dec 30 12:52 slosh.tac

দ্রষ্টব্য যে এটি আসলে ফাইলটিকে পুনর্বিবেচনা নিয়ন্ত্রণে ফিরিয়ে দেয় না। এটি চূড়ান্ত অবস্থায় উপস্থিত অবস্থানে উপস্থিত হওয়ায় এটি কেবল ফাইলটি ফেলে দেয়। তারপরে আপনি এটিকে যুক্ত করতে পারেন বা কেবল এটি বা এটি থেকে যা যা যা পরীক্ষা করতে পারেন।


6
আশ্চর্য উত্তর। কেবল সমস্যাটি হচ্ছে প্রশ্নটি এসএনএন সম্পর্কে!
JohnK

16

শুধুমাত্র জিইউআই ব্যবহার করে একটি সমাধান:

আপনি যদি ফাইলটির নাম জানেন তবে এটির সর্বশেষ সংশোধন নম্বর বা তার পথও জানেন না :

  1. রেপো ব্রাউজার থেকে মূলটিতে একটি "লগ দেখান" করুন
  2. "সমস্ত দেখান" চাপুন (লগ কথোপকথনের নীচে)
  3. ফিল্টার পাঠ্যবক্সে ফাইলের নাম টাইপ করুন (লগ ডায়ালগের শীর্ষে)

এটি কেবলমাত্র সেই সংশোধনগুলি দেখায় যেখানে ফাইলটি যুক্ত / পরিবর্তন / মোছা হয়েছিল। এটি আপনার ফাইলের ইতিহাস।

নোট করুন যে ফাইলটি যদি তার পিতামাতার কোনও ফোল্ডার মুছলে মুছে ফেলা হয় তবে লগে এটি কোনও 'মুছে ফেলা' এন্ট্রি পাবে না (এবং এমজির সমাধান কাজ করবে না)। এই ক্ষেত্রে, ফিল্টার করা লগতে এর সর্বশেষতম এন্ট্রি মুছে ফেলার সময় এর বিষয়বস্তুর সাথে মিল রাখে।


বর্বর শক্তি সবসময় বিষ্ঠা হয় না। বিশেষত বড় ভাণ্ডারে নয়।
জোনাস বাইস্টর্ম

কেবলমাত্র একটি ইউআই সমাধানের জন্য +1। কমান্ড লাইন দুর্দান্ত এবং সমস্ত, কিন্তু এটি ব্যতিক্রম ছাড়া সর্বদা সেরা উত্তর নয়। বিশেষত যখন আপনি এমন পরিবেশে কাজ করছেন যখন আপনি নিয়ন্ত্রণ করেন না এবং এসভিএন-তে সহজে কমান্ড লাইন অ্যাক্সেস নেই।
মীর

দয়া করে নোট করুন যে উপরের উত্তরটি কচ্ছপ এসভিএন জিইআইয়ের জন্য for
জর্জি মিউহেলেনবার্গ

13
svn log -v | grep -B50 YourDeletedFileName

আপনি পাথ এবং সংশোধন পাবেন। গিটে (নামগুলির জন্য পরীক্ষাও করা হয়):

git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName

-বি 50 কি করে? আমি এখানে এসভিএন লগ এবং গ্রিপ ব্যবহার করে খুব সহজেই টিপসটি ব্যবহার করে ফাইলগুলির একটি তালিকা পেতে পারি, তবে আমি আলাদা আলাদা লাইনে প্রদর্শিত হওয়ায় সংশোধন সংখ্যাগুলি সহজেই প্রদর্শিত হবে বলে মনে হচ্ছে না। আমি বি 50 জিনিসটি চেষ্টা করেছিলাম এবং আমার কাছে এটি আশ্চর্যজনকভাবে কাজ করে বলে মনে হয় না।
সিড করুন

এটি গাণিত রেখা এবং এর উপরে 50 টি লাইন আউটপুট দেয় যদি অন্য কেউ এটি পড়ছে।
সিড করুন

8

ডাস্টিনের উত্তর ছাড়াও, যদি আপনি কেবল বিষয়গুলি পরীক্ষা করতে চান এবং এটি পরীক্ষা করে না দেখতে চান তবে তার উদাহরণে আপনি এটি করতে পারেন:

$ git show 8d4a1f^:slosh.tac

দ্য: সংশোধন এবং সেই সংশোধনের একটি পথ পৃথক করে, কার্যকরভাবে নির্দিষ্ট সংশোধনীতে একটি নির্দিষ্ট পথের জন্য জিজ্ঞাসা করে।


আহ, খুব সত্য। আমি যে সত্যিই, সত্যিই কঠিন উপায় করতাম। :)
ডাস্টিন

8

এই আদেশটি ব্যবহার করুন:

svn log -v | awk '/^r[0-9]+/ { rev = $1; }; / D .*filename_escaped_for_regex/ { print rev" "$2; };'

এটি এমন সমস্ত সংশোধনী তালিকাবদ্ধ করবে যা প্যাটার্নের সাথে মেলে এমন কোনও ফাইল মুছে ফেলে। অর্থাৎ, আপনি যদি ফাইল README করুন না অনুসন্ধানের, তারপর সব /src/README, /src/README.firstএবং/some/deeply/hidden/directory/READMENOT পাওয়া যায় এবং তালিকাভুক্ত করা হবে।

যদি আপনার ফাইলের নামটিতে স্ল্যাশ (পথ), বিন্দুগুলি বা অন্যান্য বিশেষ রেজেক্স অক্ষর থাকে তবে অমিল বা ত্রুটি এড়াতে এড়াতে ভুলবেন না।


7

যদি আপনি মুছে ফেলা ফাইলটির পথটি না জানেন তবে সক্রিয় হয়ে যায় আপনি অন্যথায় অতি-ভারী আদেশে এটি অনুসন্ধান করতে পারেন svn log:

svn log --search <deleted_file_or_pattern> -v

কমান্ডটি সার্ভারের বিকল্পটি সার্ভারের বিকল্প হিসাবে যতটা হ্যামার করছে ঠিক ততটুকু ক্ষতিগ্রস্ত করছে তবে অন্তত জড়িত সংস্থানগুলি (আপনার চোখের ছাঁদাসহ) অন্তরঙ্গভাবে মুক্তি পাবে, কারণ এটি আপনাকে বলবে যে কোন ফাইলটি মুছে ফেলা হয়েছিল সেই সংশোধনীতে। তারপরে, আপনি অন্যান্য টিপস অনুসরণ করতে পারেন (মূলত একই svn logকমান্ডটি ব্যবহার করে তবে ইতিমধ্যে একটি সংজ্ঞায়িত পথে)।


svn log --search _test2.php -v... এসএনএন: অবৈধ বিকল্প:
অনুসন্ধান

5

পোস্টারটি এখানে আসলে 3 টি প্রশ্ন জিজ্ঞাসা করেছে:

  1. আমি কীভাবে সাবভার্সিয়নে মুছে ফেলা ফাইলটির ইতিহাসের দিকে নজর দেব?
  2. সাবভারশনে মুছে ফেলা ফাইলের বিষয়বস্তুগুলিকে আমি কীভাবে দেখতে পারি?
  3. আমি কীভাবে সাবভার্সনে মুছে ফেলা ফাইলটি পুনরুত্থিত করব?

আমি এখানে দেখতে সমস্ত উত্তর 2 এবং 3 প্রশ্নের জন্য।

প্রথম প্রশ্নের উত্তর হ'ল:

svn log http://server/svn/project/file@1234

ফাইলটি যখন সর্বশেষে উপস্থিত ছিল তখন আপনাকে পুনর্বিবেচনা নম্বরটি পেতে হবে, যার স্পষ্টভাবে এখানে অন্যরা উত্তর দিয়েছেন।


4

আহ, যেহেতু আমি বাজার ব্যবহার করতে শিখছি, এটি এমন একটি বিষয় যা আমি চেষ্টা করেছি। সাফল্য ব্যতীত, এটি প্রদর্শিত হয় আপনি সরানো ফাইলগুলিতে লগ এবং টীকা দিতে পারবেন না ... :-(

চেষ্টা করা হয়েছে:

> bzr log -r 3 Stuff/ErrorParser.hta
bzr: ERROR: Path does not have any revision history: Stuff/ErrorParser.hta

তবে কৌতূহলীভাবে (এবং সৌভাগ্যক্রমে) আমি এটি করতে পারি:

> bzr cat -r 3 Stuff/ErrorParser.hta

এবং:

> bzr diff -r 2..3 Stuff/ErrorParser.hta

এবং উপরের বাগে যেমন পরামর্শ দেওয়া হয়েছে:

> bzr log -v | grep -B 1 ErrorParser

(সমন্বয় -B( --before-context) প্রয়োজনীয় হিসাবে পরামিতি)।


1

আপনার একটি পুনর্বিবেচনা নির্দিষ্ট করতে হবে।

svn log -r <revision> <deleted file>

1
এটি একটি ত্রুটি দেয়। উদাহরণ: 37428 -r SVN লগ svn.example.com/deletedfile.java SVN: '/!svn/bc/98571/deletedfile.java' পথ পাওয়া যায়নি
জেরেমি

আপনি কি নিশ্চিত যে এই সংশোধনীতে এটি বিদ্যমান? আপনাকে ফাইলটি আসলে বিদ্যমান ছিল এমন একটি সংশোধন নির্দিষ্ট করতে হবে।
জ্যাক এম।

বার্ট হুয়েজেনের উত্তরটি -r37428 এর মধ্যে বিস্মৃত এবং এসভিএন ইউআরএলে @ 37428 যোগ করার জন্য দেখুন।
দুবেক


1

আমি একটি উত্তর চেয়েছিলাম, নিজেই। কেবল আউটপুট থেকে আউটপুট দিতে নিম্নলিখিতটি চেষ্টা করুন svn log

svn log --stop-on-copy --verbose [--limit <limit>] <repo Url> | \
awk '{ if ($0 ~ /^r[0-9]+/) rev = $0 }
  { if ($0 ~ /^ D /) { if (rev != "") { print rev; rev = "" }; print $0 } }'

এটি লগ আউটপুট মাধ্যমে ফিল্টার awk এরawk এটি আবিষ্কার করে এমন প্রতিটি পুনর্বিবেচনা রেখাকে বাফার করে, কেবল মুছার রেকর্ড পাওয়া গেলেই আউটপুট দেয়। প্রতিটি পুনর্বিবেচনা কেবল একবার আউটপুট হয়, সুতরাং একটি পুনর্বিবেচনার একাধিক মুছে ফেলাগুলি একসাথে গোষ্ঠীভুক্ত করা হয়েছে (মান অনুসারে)svn log আউটপুট )।

--limitফিরে আসা রেকর্ডের পরিমাণ হ্রাস করতে আপনি একটি নির্দিষ্ট করতে পারেন can আপনি এটি অপসারণ করতে পারেন--stop-on-copy প্রয়োজন হিসাবে ।

আমি জানি পুরো লগটি পার্স করার দক্ষতা সম্পর্কে অভিযোগ রয়েছে। আমি মনে করি এটি গ্রেপ এর থেকে ভাল সমাধান এবং এর "কাস্ট ওয়াইড নেট" -Bবিকল্প। আমি জানি না এটি আরও দক্ষ কিনা, তবে এর বিকল্পের কথা ভাবতে পারি না svn log। এটি @ আলেকজান্ডার আমলকিনের উত্তরের মতো, তবে নির্দিষ্ট নামের দরকার নেই। এটি আমার প্রথম অ্যাজক স্ক্রিপ্টও তাই এটি প্রচলিত হতে পারে।


1

ধরে নিন আপনার ফাইলটির নাম ~ / src / a / b / c / नष्ट করা হয়েছে ile

cd ~/src/a/b/c  # to the directory where you do the svn rm or svn mv command
#cd ~/src   # if you forget the correct directory, just to the root of repository
svn log -v | grep -w -B 9 deleted.file | head  # head show first 10 lines

নমুনা আউটপুট, এটি r90440 এ পাওয়া গেছে

...
r90440 | user | 2017-02-03 11:55:09 +0800 (Fri, 03 Feb 2017) | 4 lines
Changed paths:
  M /src/a/b/c/foo
  M /src/a/b/c/bar
  D /src/a/b/c/deleted.file

আগের সংস্করণে এটি অনুলিপি করুন (90439 = 90440-1)

svn cp URL_of_deleted.file@90439 .

0

আপনি সর্বশেষ সংশোধনীটি খুঁজে পেতে পারেন যা বাইনারি অনুসন্ধান ব্যবহার করে ফাইল সরবরাহ করে। আমি এর /bin/bashজন্য একটি সাধারণ স্ক্রিপ্ট তৈরি করেছি :

function svnFindLast(){
 # The URL of the file to be found
 local URL="$1"
 # The SVN revision number which the file appears in (any rev where the file DOES exist)
 local r="$2"
 local R
 for i in $(seq 1 "${#URL}")
  do
   echo "checkingURL:'${URL:0:$i}'" >&2
   R="$(svn info --show-item revision "${URL:0:$i}" 2>/dev/null)"
   echo "R=$R" >&2
   [ -z "$R" ] || break
 done
 [ "$R" ] || {
  echo "It seems '$URL' is not in a valid SVN repository!" >&2
  return -1
 }
 while [ "$r" -ne "$R" -a "$(($r + 1))" -ne "$R" ]
 do
  T="$(($(($R + $r)) / 2))"
  if svn log "${URL}@${T}" >/dev/null 2>&1
   then
    r="$T"
    echo "r=$r" >&2
   else
    R="$T"
    echo "R=$R" >&2
  fi
 done
 echo "$r"
}

-1

আমি একটি পিএইচপি স্ক্রিপ্ট লিখেছিলাম যা আমার সমস্ত সংগ্রহস্থলের এসএনএন লগকে একটি মাইএসকিএল ডাটাবেসে অনুলিপি করে। আমি এখন আমার মন্তব্য বা ফাইলগুলির নামগুলিতে সম্পূর্ণ পাঠ্য অনুসন্ধান করতে পারি।

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