فحص تاريخ الملف المحذوف
-
03-07-2019 - |
سؤال
إذا قمت بحذف ملف في 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
لاحظ أن هذا لا يضع في الواقع الملف مرة أخرى في مراجعة مراقبة. ببساطة يسقط الملف كما كانت موجودة في حالته النهائية في الموقع الحالي. ثم يمكنك إضافته أو مجرد تفتيشها أو أيا من تلك النقطة.
الحل باستخدام واجهة المستخدم الرسومية فقط:
إذا كنت تعرف اسم الملف، ولكن لا أعرف رقم المراجعة الأخير أو حتى مساره:
- من متصفح Repo، قم بعمل "إظهار السجل" على الجذر
- اضغط على "إظهار الكل" (في أسفل مربع حوار السجل)
- اكتب اسم الملف في مربع نص التصفية (في الجزء العلوي من مربع حوار السجل)
سيُظهر هذا بعد ذلك فقط تلك المراجعات التي تمت إضافة/تعديل/حذف الملف فيها. هذا هو تاريخ الملف الخاص بك.
لاحظ أنه إذا تم حذف الملف عن طريق حذف أحد المجلدات الرئيسية الخاصة به، فلن يحتوي على إدخال "محذوف" في السجل (وبالتالي لن يعمل حل 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
الأمر، ولكن بالفعل على مسار محدد).
لقد طرح الملصق في الواقع ثلاثة أسئلة هنا:
- كيف يمكنني إلقاء نظرة على تاريخ الملف المحذوف في Subversion؟
- كيف يمكنني إلقاء نظرة على محتويات الملف المحذوف في Subversion؟
- كيف يمكنني إحياء ملف محذوف في 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 .