سؤال

إذا قمت بحذف ملف في Subversion، كيف يمكنني الاطلاع على تاريخه ومحتوياته؟إذا حاولت أن أفعل svn cat أو svn log على ملف غير موجود، فإنه يشكو من أن الملف غير موجود.

أيضًا، إذا أردت إعادة إحياء الملف، فهل يجب علي ذلك؟ svn add إعادته؟

(لقد سألت على وجه التحديد عن Subversion، ولكني أود أيضًا أن أسمع عن كيفية تعامل Bazaar وMercurial وGit مع هذه الحالة أيضًا.)

هل كانت مفيدة؟

المحلول

لتحصل على سجل ملف محذوف، استخدم

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 cat http://server/svn/project/file -r 1234

و

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

الإصدار الأول ينظر إلى المسار الذي هو الآن متاح كما http://server/svn/project/file ويسترد هذا الملف كما كان في المراجعة 1234.(هكذا يفعل بناء الجملة هذا لا العمل بعد حذف الملف).

بناء الجملة الثاني يحصل على الملف الذي كان متاحا باسم http://server/svn/project/file في المراجعة 1234.لذلك بناء الجملة هذا يفعل العمل على الملفات المحذوفة.

يمكنك أيضًا دمج هذه الطرق لاسترداد ملف كان متاحًا في المراجعة 2345 كـ http://server/svn/project/file ولكن بالمحتويات كما كانت في عام 1234 مع:

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

أولا، ابحث عن رقم المراجعة حيث حصلت على حذف الملف:

svn log -v > log.txt

وبعد ذلك ننظر في log.txt (لا المعلم SVN، لذلك أنا لا أعرف طريقة أفضل) ليتماشى مع

D <deleted file>

ووالتي ترى والمراجعة التي كانت. ثم، كما هو الحال في إجابات أخرى، بعث الملف باستخدام المراجعة السابقة.

وانها شيء خاص لا سيما في بوابة. إذا كنت تعرف اسم الملف، يمكنك معرفة التغيير الذي إزالته مع السجل:

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

لاحظ أن هذا لا يضع في الواقع الملف مرة أخرى في مراجعة مراقبة. ببساطة يسقط الملف كما كانت موجودة في حالته النهائية في الموقع الحالي. ثم يمكنك إضافته أو مجرد تفتيشها أو أيا من تلك النقطة.

الحل باستخدام واجهة المستخدم الرسومية فقط:

إذا كنت تعرف اسم الملف، ولكن لا أعرف رقم المراجعة الأخير أو حتى مساره:

  1. من متصفح Repo، قم بعمل "إظهار السجل" على الجذر
  2. اضغط على "إظهار الكل" (في أسفل مربع حوار السجل)
  3. اكتب اسم الملف في مربع نص التصفية (في الجزء العلوي من مربع حوار السجل)

سيُظهر هذا بعد ذلك فقط تلك المراجعات التي تمت إضافة/تعديل/حذف الملف فيها. هذا هو تاريخ الملف الخاص بك.

لاحظ أنه إذا تم حذف الملف عن طريق حذف أحد المجلدات الرئيسية الخاصة به، فلن يحتوي على إدخال "محذوف" في السجل (وبالتالي لن يعمل حل mjy).وفي هذه الحالة، فإن أحدث إدخال له في السجل الذي تمت تصفيته سيتوافق مع محتوياته عند الحذف.

svn log -v | grep -B50 YourDeletedFileName

هل تحصل على مسار والمراجعة. في بوابة (يتحقق أيضا لإعادة تسمية):

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

وبالإضافة إلى الإجابة داستن، وإذا كنت ترغب فقط في فحص محتويات، وليس التحقق من ذلك، في مثاله يمكنك القيام به:

$ git show 8d4a1f^:slosh.tac

وو: يفصل مراجعة والمسار في هذه المراجعة، وطلب بشكل فعال لمسار معين في تنقيح محددة

استخدم هذا الأمر:

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 سيتم العثور عليها وإدراجها.

إذا كان لديك اسم الملف تحتوي على خطوط مائلة (المسار)، أو نقاط، أو غيرها من أحرف regex الخاصة، فلا تنس الهروب منها لتجنب عدم التطابق أو الأخطاء.

إذا كنت لا تعرف المسار إلى الملف المحذوف، فمن الواضح أنه يمكنك ذلك يبحث لأنه في خلاف ذلك ثقيلة جدا svn log يأمر:

svn log --search <deleted_file_or_pattern> -v

من المحتمل أن يؤدي الأمر إلى ضرب الخادم بنفس القدر الذي يحدث بدون خيار البحث، ولكن على الأقل ستكون بقية الموارد المعنية (بما في ذلك مقل عينيك) مرتاحة نوعًا ما، لأن ذلك سيخبرك في أي مراجعة تم حذف هذا الملف.بعد ذلك، يمكنك اتباع النصائح الأخرى (باستخدام نفس النصائح بشكل أساسي). svn log الأمر، ولكن بالفعل على مسار محدد).

لقد طرح الملصق في الواقع ثلاثة أسئلة هنا:

  1. كيف يمكنني إلقاء نظرة على تاريخ الملف المحذوف في Subversion؟
  2. كيف يمكنني إلقاء نظرة على محتويات الملف المحذوف في Subversion؟
  3. كيف يمكنني إحياء ملف محذوف في Subversion؟

جميع الإجابات التي أراها هنا هي للسؤالين 2 و 3.

الجواب على السؤال 1 هو:

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

لا تزال بحاجة إلى الحصول على رقم المراجعة الخاص بوقت وجود الملف آخر مرة، والذي يتم الرد عليه بوضوح من قبل الآخرين هنا.

وآه، لأنني أتعلم لاستخدام بازار، بل هو شيء حاولت. ولكن دون جدوى، يبدو لا يمكنك تسجيل و تعليم الملفات التي تم حذفها حاليا ...: - (

وحاول:

> 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) معلمة حسب الحاجة).

وأنت سوف تحتاج إلى تحديد مراجعة.

svn log -r <revision> <deleted file>

إذا كنت ترغب في إلقاء نظرة على تاريخ من ملف قبل أن يتم إعادة تسميته، ثم كما هو مذكور في <لأ href = "https://stackoverflow.com/questions/2641146/handling-file-renames-in -git / 2641221 # 2641221 "> تعليق هنا يمكنك استخدام

git log --follow -- current_file_name

وكنت أريد جوابا، نفسي. حاول القيام بما يلي لإخراج يحذف فقط من 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 لتقليل كمية من السجلات التي تم إرجاعها. تستطيع أيضا إزالة --stop-on-copy، حسب الحاجة.

وأعرف أن هناك شكاوى حول كفاءة تحليل سجل كله. وأعتقد أن هذا هو الحل أفضل من البقرى و "يلقي شبكة واسعة" الخيار -B. أنا لا أعرف إذا كان هو أكثر كفاءة، ولكن لا يمكنني التفكير في بديل لsvn log. انها مماثلة لإجابةAlexander Amelkin، ولكن لا يحتاج إلى اسم محدد. كما انها لقائي الأول <م> AWK النصي، لذلك قد يكون غير تقليدية.

وكتبت السيناريو فب أن نسخ سجل إس من كل ما عندي من المستودعات في قاعدة بيانات الخلية. يمكنني الآن القيام بالبحث النص الكامل على تعليقاتي أو أسماء الملفات.

ويمكنك العثور على المراجعة الأخيرة التي تنص على الملف باستخدام البحث الثنائي. لقد خلق برنامج نصي /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"
}

وافترض الملف اختير ~ / SRC / أ / ب / ج / deleted.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 .
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top