हटाए गए फ़ाइल के इतिहास की जांच


159

यदि मैं तोड़फोड़ में एक फ़ाइल को हटाता हूं, तो मैं इसे इतिहास और सामग्री पर कैसे देख सकता हूं? अगर मैं करने की कोशिश करूंsvn catsvn 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

किसी भी स्थिति में, हटाए गए फ़ाइल को वापस लाने के लिए 'svn up' का उपयोग न करें!


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

5
हालाँकि, मैं फ़ाइल का पूरा इतिहास कैसे देख सकता हूँ?
बेंजामिन पीटरसन

71
सरल: '-v' स्विच के साथ एक मूल फ़ोल्डर के लिए लॉग दिखाएं: आप हर प्रविष्टि के लिए बदले हुए रास्तों की सूची प्राप्त करेंगे। सामने एक 'डी' और अपनी हटाई गई फ़ाइल का नाम खोजें। यह वह संशोधन है जहां फ़ाइल हटा दी गई है।
स्टीफन

8
यह हटाई गई फ़ाइलों के लिए काम नहीं करता है। यदि मैं यह कोशिश करता हूं, तो मुझे यह त्रुटि संदेश मिलता है: svn cat [url] /trunk/include/syeka/poster_funk.incl.php -r 50> out.txt svn: '/ admintools /! Svn / bc / 131 / trunk / शामिल हैं / syeka / poster_funk.incl.php 'पथ नहीं मिला @Bert Huijben की प्रतिक्रिया इस सूत्र को काम के समाधान के लिए और नीचे देखें।
कीथ पामर जूनियर

2
अगर मेरे पास 100,000 हिट्स वाला रेपो है, तो "lastrevisionthefileexisted" खोजना आसान नहीं है!
जॉन वाट

151

जब आप पुरानी फाइलों को देखना चाहते हैं तो आपको वास्तव में अंतर पता होना चाहिए:

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

तथा

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

रास्ता है कि है पर पहले संस्करण दिखता है अब के रूप में उपलब्ध http: // सर्वर / SVN / परियोजना / फ़ाइल और retrieves उस फ़ाइल के रूप में यह संशोधन 1234 में किया गया था (तो यह वाक्य रचना करता है नहीं एक फ़ाइल को नष्ट करने के बाद काम)।

दूसरे सिंटैक्स में वह फाइल मिलती है जो http: // server / svn / project / file के रूप में रिवीजन 1234 में उपलब्ध थी। इसलिए यह सिंटैक्स डिलीट की गई फाइलों पर काम करता है

आप इन विधियों को एक फाइल को पुनः प्राप्त करने के लिए भी संयोजित कर सकते हैं जो कि 2345 में http: // server / svn / project / file के रूप में उपलब्ध थी, लेकिन सामग्री के साथ जैसा कि 1234 में था:

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

7
गह, धन्यवाद! इस धागे में वर्तमान शीर्ष प्रतिक्रिया का उल्लेख नहीं है, यह बहुत अच्छा है!
कीथ पामर जूनियर 15

यह तब भी मेरे लिए विफल रहा जब तक कि मैंने निरपेक्ष पथों का उपयोग नहीं किया, क्योंकि मेरे स्थानीय svn क्लाइंट एक त्रुटि दे रहा था ./local/fileजब ./localनिर्देशिका मौजूद नहीं होने पर हल करने में असमर्थ था। यह SVN के नए संस्करणों के लिए समस्या नहीं हो सकती है।
डेरिक राइस

2
@DerrickRice: उस स्थिति में, ^अंकन काम आता है: यह रिपॉजिटरी रूट को संदर्भित करता है, इसलिए आप कह सकते हैं svn cat ^/local/file@REV(रिपॉजिटरी रूट और URL के बीच की दूरी के आधार पर)।
मुसीफिल

यह सिद्धांत रूप में महान काम करता है। फ़ोल्डरों के लिए मैं निम्नलिखित प्राप्त करता हूं: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 लॉग -v | grep D "file.name"
abatishchev

18
प्रश्न का सही उत्तर देने वाला पहला व्यक्ति होने के लिए +1। यदि आप हटाए जाने से पहले संशोधन को नहीं जानते हैं तो आप सामग्री को नहीं देख सकते।
सेरिन जूल

8
@abatishchev यह हटाई गई फ़ाइलों की सूची प्राप्त करता है, लेकिन संशोधन जानकारी को छोड़ देता है, इसलिए यह उपयोगी नहीं है। यदि आप बहुत बड़े / पुराने रिपॉजिटरी के साथ बहुत अधिक परिवर्तन इतिहास के साथ काम कर रहे हैं, तो यह धीमा है
tchen

4
अच्छा, @ abatishchev के सुधार के साथ महान। tchen: आसानी से तय -B50 या grep के तर्क का उपयोग करके, मेरा उत्तर देखें।
जोनास बिस्ट्राम

2
बहुत बड़े / पुराने रिपॉजिटरी के लिए svn लॉग -v आउटपुट को सीमित करने का एक और अच्छा तरीका -l विकल्प है। तो आप svn log -v -l 100 का उपयोग कर सकते हैं | grep D "file.name"
माइंडमैटर्स

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
अद्भुत जवाब। केवल समस्या यह है कि सवाल svn के बारे में है!
जॉन जूल

16

केवल GUI का उपयोग करके एक समाधान:

यदि आप फ़ाइल का नाम जानते हैं, लेकिन इसका अंतिम संशोधन नंबर या यहां तक ​​कि उसका रास्ता नहीं जानते हैं :

  1. रेपो ब्राउज़र से रूट पर "शो लॉग" करें
  2. हिट "सभी दिखाएं" (लॉग डायलॉग के निचले भाग पर)
  3. फ़िल्टर टेक्स्टबॉक्स में फ़ाइल नाम टाइप करें (लॉग डायल के शीर्ष पर)

यह तब केवल उन संशोधनों को दिखाएगा जहां फ़ाइल को जोड़ा / संशोधित / हटा दिया गया था। यह फ़ाइल का आपका इतिहास है।

ध्यान दें कि यदि फ़ाइल को उसके मूल फ़ोल्डर में से किसी एक को हटाकर हटा दिया गया था, तो उसके पास लॉग में 'हटाई गई' प्रविष्टि नहीं होगी (और इसलिए mjy का समाधान काम नहीं करेगा)। इस मामले में, फ़िल्टर किए गए लॉग में इसकी सबसे हाल की प्रविष्टि विलोपन के समय इसकी सामग्री के अनुरूप होगी।


जानवर बल हमेशा बकवास नहीं है। खासकर बड़े रेपो पर नहीं।
जोनास बिस्ट्रॉम

यूआई केवल समाधान के लिए +1। कमांड लाइन महान है, और सभी, लेकिन यह हमेशा अपवाद के बिना सबसे अच्छा जवाब नहीं है। खासकर जब आप एक ऐसे वातावरण में काम कर रहे हों जिसे आप नियंत्रित नहीं करते हैं, और एसवीएन में आसान कमांड लाइन नहीं है।
मीर

कृपया ध्यान दें कि उपरोक्त उत्तर TortoiseSVN GUI के लिए है।
जॉर्ज मुलेनबर्ग

13
svn log -v | grep -B50 YourDeletedFileName

आपको रास्ता और संशोधन मिलेगा। Git में (नाम बदलने के लिए भी जाँच):

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

-B50 क्या करता है? मैं svn लॉग का उपयोग करके फ़ाइलों की एक सूची प्राप्त कर सकता हूं और यहां युक्तियों का उपयोग करके आसानी से grep कर सकता हूं, लेकिन मैं संशोधन संख्याओं को आसानी से प्रदर्शित नहीं कर सकता, जैसा कि वे एक अलग लाइन पर प्रदर्शित होते हैं। मैंने B50 की कोशिश की और यह मेरे लिए आश्चर्यजनक रूप से काम नहीं करता था।
cdd

यह गणित की रेखा और ऊपर की 50 पंक्तियों को उस स्थिति में आउटपुट करता है जब कोई अन्य इसे पढ़ रहा हो।
cedd

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... svn: अमान्य विकल्प:
खोज

5

पोस्टर ने वास्तव में यहाँ 3 प्रश्न पूछे हैं:

  1. मैं तोड़फोड़ में हटाए गए फ़ाइल के इतिहास को कैसे देखूं?
  2. मैं तोड़फोड़ में हटाए गए फ़ाइल की सामग्री को कैसे देखूं?
  3. मैं तोड़फोड़ में हटाई गई फ़ाइल को कैसे पुनर्जीवित करूं?

मेरे द्वारा देखे गए सभी उत्तर 2 और 3 के प्रश्न हैं।

प्रश्न 1 का उत्तर है:

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
यह एक त्रुटि देता है। उदाहरण: svn log -r 37428 svn.example.com/deletedfile.java svn: '/ -svn/bc/98571/deletedfile.java' पथ नहीं मिला
जेरेमी

क्या आप सुनिश्चित हैं कि यह उस संशोधन में मौजूद था? आपको एक संशोधन निर्दिष्ट करना होगा जहां फ़ाइल वास्तव में मौजूद थी।
जैक एम।

Br Huijben द्वारा -r37428 के बीच अलग-अलग और SVN URL पर @ 37428 जोड़ने का उत्तर देखें।
dubek


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 } }'

यह aw के माध्यम से लॉग आउटपुट को फ़िल्टर करता है । awk बफ़र्स प्रत्येक रिविजन लाइन को खोजता है, इसे केवल तब डिलीट करता है जब कोई डिलीट रिकॉर्ड मिलता है। प्रत्येक संशोधन केवल एक बार आउटपुट होता है, इसलिए संशोधन में कई हटाए गए को एक साथ समूहीकृत किया जाता है (मानक के रूप मेंsvn log आउटपुट में)।

आप --limitदिए गए रिकॉर्ड की मात्रा को कम करने के लिए एक निर्दिष्ट कर सकते हैं । आप --stop-on-copyआवश्यकतानुसार हटा भी सकते हैं ।

मुझे पता है कि पूरे लॉग को पार्स करने की दक्षता के बारे में शिकायतें हैं। मुझे लगता है कि यह grep से बेहतर उपाय है और इसका "एक विस्तृत जाल डाले" -Bविकल्प है। मुझे नहीं पता कि यह अधिक कुशल है, लेकिन मैं इसके विकल्प के बारे में नहीं सोच सकताsvn log । यह @Alexander Amelkin के उत्तर के समान है, लेकिन इसे किसी विशिष्ट नाम की आवश्यकता नहीं है। यह मेरी पहली awk स्क्रिप्ट भी है, इसलिए यह अपरंपरागत हो सकती है।


1

मान लें कि आपकी फ़ाइल का नाम ~ / src / a / b / c / delete.file रखा गया था

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

मैंने एक php स्क्रिप्ट लिखी है जो मेरे सभी रिपॉजिटरी के svn लॉग को mysql डेटाबेस में कॉपी करती है। अब मैं अपनी टिप्पणियों या फ़ाइलों के नाम पर पूर्ण पाठ खोज कर सकता हूं।

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