كيفية تحرير رسالة السجل التي تم الالتزام بها بالفعل في Subversion؟

StackOverflow https://stackoverflow.com/questions/304383

  •  08-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة لتحرير رسالة السجل لمراجعة معينة في Subversion؟لقد كتبت بطريق الخطأ اسم الملف الخاطئ في رسالة الالتزام الخاصة بي والتي قد تكون مربكة لاحقًا.

رأيت كيف أقوم بتحرير رسالة التزام غير صحيحة في Git؟, ، ولكن لا يبدو أن حل هذا السؤال مشابهًا لـ Subversion (وفقًا لـ svn help commit).

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

المحلول

في الأساس، يجب أن يكون لديك حقوق المسؤول (بشكل مباشر أو غير مباشر) للمستودع للقيام بذلك.يمكنك إما تكوين المستودع للسماح لجميع المستخدمين بالقيام بذلك، أو يمكنك تعديل رسالة السجل مباشرة على الخادم.

يرى هذا الجزء التابع الأسئلة الشائعة حول التخريب (التأكيد على الألغام):

يتم الاحتفاظ رسائل السجل في المستودع كخصائص متصلة بكل مراجعة. افتراضيًا ، لا يمكن تحرير خاصية رسالة السجل (SVN: LOG) بمجرد ارتكابها.ذلك لأن التغييرات في خصائص المراجعة (التي SVN: LOG واحد) تتسبب في تجاهل القيمة السابقة للممتلكات بشكل دائم ، ويحاول التخريب منعك من القيام بذلك عن طريق الخطأ.ومع ذلك ، هناك عدة طرق للحصول على تخريب لتغيير خاصية المراجعة.

الطريقة الأولى هي أن يقوم مسؤول المستودع بتمكين تعديلات الممتلكات المراجعة.يتم ذلك عن طريق إنشاء خطاف يسمى "revprop-change" (انظر هذا القسم في كتاب التخريب لمزيد من التفاصيل حول كيفية القيام بذلك).تتمتع خطاف "revprop-change" بإمكانية الوصول إلى رسالة السجل القديمة قبل تغييرها ، بحيث يمكنه الحفاظ عليها بطريقة أو بأخرى (على سبيل المثال ، عن طريق إرسال بريد إلكتروني).بمجرد تمكين تعديلات الممتلكات المراجعة ، يمكنك تغيير رسالة سجل المراجعة عن طريق تمرير -REVProp Switch إلى SVN Propedit أو SVN ، مثل أي من هذه:

$svn propedit -r N --revprop svn:log URL 
$svn propset -r N --revprop svn:log "new log message" URL 

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

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

$ svnadmin setlog REPOS_PATH -r N FILE

عندما يكون REPOS_PATH موقع المستودع ، فإن N هو رقم المراجعة الذي ترغب في تغييره ، والملف هو ملف يحتوي على رسالة السجل الجديدة.إذا لم يكن خطاف "revprop-change" في مكانه (أو كنت ترغب في تجاوز البرنامج النصي الخطاف لسبب ما) ، فيمكنك أيضًا استخدام خيار-bypass-hooks.ومع ذلك ، إذا قررت استخدام هذا الخيار ، فكن حذرًا للغاية.قد تتجاوز أشياء مثل إخطارات البريد الإلكتروني للتغيير ، أو أنظمة النسخ الاحتياطي التي تتبع خصائص المراجعة.

نصائح أخرى

عند تشغيل هذا الأمر،

svn propedit svn:log --revprop -r NNN 

ووفقط في حال كنت ترى هذه الرسالة:

<اقتباس فقرة>   فشل

وطلب DAV. فمن الممكن أن   قبل revprop تغير مستودع ل   ربط إما فشلت أو غير موجودة

ولها بسبب التخريب لا يسمح لك بتعديل رسائل سجل لأنها غير معلومة الإصدار وسيتم فقدان بشكل دائم.

يونكس استضافة SVN

وانتقل إلى الدليل السنانير على خادم التخريب الخاصة بك (استبدال ~ / إس / reponame مع الدليل من المخزون الخاص بك)

cd ~/svn/reponame/hooks

وإزالة تمديد

mv pre-revprop-change.tmpl pre-revprop-change

وجعله قابل للتنفيذ (لا تستطيع أن تفعل شمود + س!)

chmod 755 pre-revprop-change

المصدر

ويندوز استضافة SVN

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

وهنا الاختلاف مفيد أن لا أرى المذكورة في التعليمات. يمكنك العودة الرسالة الحالية للتحرير عن طريق تحديد محرر النصوص.

svn propedit svn:log --revprop -r N --editor-cmd vim
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt

وكلف I مؤخرا مع هذا أيضا.

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

وبعد النظر في بضعة أمثلة أخرى على الانترنت I اخترق هذا معا، ونحن في بيئة ويندوز، لذلك هذا هو مضمون لدينا من pre-revprop-change.bat:

@ECHO OFF

set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow changes to svn:log. The author, date and other revision
:: properties cannot be changed
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%propname%'=='svn:log' goto ERROR_PROPNAME

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow modifications to svn:log (no addition/overwrite or deletion)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%action%'=='M' goto ERROR_ACTION

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify their own log messages
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set AUTHOR=
for /f "delims=" %%a in ('svnlook author -r %REV% %REPOS%') do @set AUTHOR=%%a

if /I not '%AUTHOR%'=='%user%' goto ERROR_WRONGUSER

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify log messages from today, old messages locked down
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set DATESTAMP=
for /f "delims=" %%a in ('svnlook date -r %REV% %REPOS%') do @set DATESTAMP=%%a

for /F "tokens=1-2 delims= " %%a in ("%DATESTAMP%") do (
 set DATESTAMPDATE=%%a
 set DATESTAMPTIME=%%b )

:: Expects DATESTAMPDATE in the format: 2012-02-24
for /F "tokens=1-3 delims=-" %%a in ("%DATESTAMPDATE%") do (
 set DATESTAMPYEAR=%%a
 set DATESTAMPMONTH=%%b
 set DATESTAMPDAY=%%c )

:: Expects date in the format: Thu 08/01/2013
for /F "tokens=1-4 delims=/ " %%a in ("%date%") do (
 set YEAR=%%d
 set MONTH=%%b
 set DAY=%%c )

if /I not '%DATESTAMPYEAR%'=='%YEAR%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPMONTH%'=='%MONTH%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
 set bIsEmpty=false
)
if '%bIsEmpty%'=='true' goto ERROR_EMPTY

goto :eof

:ERROR_EMPTY
echo Empty svn:log properties are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_WRONGUSER
echo You are not allowed to modify other user's log messages. >&2
goto ERROR_EXIT

:ERROR_MSGTOOOLD
echo You are not allowed to modify log messages older than today. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1 

وتحرير: الفكرة الأصلية لهذا جاءت من <لأ href = "http://www.svnforum.org/threads/39203-Pre-revprop-change-shell-script-allows-commiters-to-change-own- تسجيل داخل-X آخر الليل "> هذا الموضوع :

على نظام التشغيل Windows، باستخدام عميل Tortoise SVN:

  1. انقر بزر الماوس الأيمن على مجلد المشروع الخاص بك واختر "إظهار السجل"
  2. في نافذة رسائل السجل، انقر بزر الماوس الأيمن على المراجعة واختر "تحرير رسالة السجل"

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

إذا كنت تستخدم IDE مثل كسوف الشمس، يمكنك استخدام هذه الطريقة سهلة.

Right click on the project -> Team - Show history

في أن right click on the revision id for your commit and select 'Set commit properties'.

يمكنك تعديل الرسالة على النحو الذي تريد من هنا.

إذا تمكن المخزون الخاص بك إعداد خصائص المراجعة عن طريق ربط ما قبل revprop تغيير يمكنك تغيير رسائل سجل أسهل بكثير.

svn propedit --revprop -r 1234 svn:log url://to/repository

وأو في تورتويز إس في إن، AnkhSVN وغيرها ربما العديد من العملاء التخريب عن طريق النقر بزر الماوس الأيمن على إدخال سجل ثم "تغيير رسالة سجل".

ال الأسئلة الشائعة حول التخريب يغطي هذا، ولكنه يستخدم مجموعة من المصطلحات المربكة غير المحددة مثل REPOS_PATH دون إعطاء أي أمثلة فعلية.

قد يستغرق الأمر بضع محاولات حتى يعمل، لذا احفظ رسالة الالتزام المحدثة في ملف.على عكس مع svn-commit.tmp الملفات، لن يحافظ Subversion على كتابتك إذا كانت هناك مشكلة.

في دليل العمل الخاص بك، قم بتشغيل

svn propedit -r N --revprop svn:log

لتحرير رسالة الالتزام.إذا كان هذا يعمل، عظيم!لكن من المحتمل ألا يحدث ذلك، لأن svn:log revision تم إلغاء إصدارها وسيمنعك Subversion افتراضيًا من الكتابة فوقها، إما باستخدام هوك النصي pre-revprop-change, أو رسالة خطأ تفيد بعدم وجود مثل هذا الخطاف.

لتغيير الخطافات، تحتاج إلى الوصول إلى نظام الملفات الذي يستضيف المستودع عليه. svn info سيخبرك بجذر المستودع.لنفترض أنه ~/svnrepo.

  1. cd ل ~/svnrepo/hooks
  2. هل يوجد pre-revprop-change أوpre-revprop-change.bat النصي؟إذا كان الأمر كذلك ، فإن التعليق مؤقتًا على الجزء الذي يتم الإحباط إذا حاولت التغيير svn:log.
  3. خلاف ذلك ، على Windows ، قم بإنشاء ملف فارغ يسمى pre-revprop-change.bat.إليك طريقة واحدة للقيام بذلك:

    copy con pre-revprop-change.bat
    ^Z
    
  4. خلاف ذلك، على يونكس، تشغيل

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. في نسخة العمل، قم بتشغيل svn propedit -r N --revprop svn:log مرة أخرى

  6. التراجع عن التغييرات التي أجريتها على ~/svnrepo/hooks/svn-revprop-change(.bat)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top