लॉग संदेश को पहले से ही तोड़फोड़ में कैसे संपादित करें?


550

क्या तोड़फोड़ में एक निश्चित संशोधन के लॉग संदेश को संपादित करने का एक तरीका है? मैंने गलती से अपने प्रतिबद्ध संदेश में गलत नाम लिख दिया जो बाद में भ्रमित हो सकता है।

मैंने देखा है कि मैं कैसे Git में एक गलत प्रतिबद्ध संदेश संपादित कर सकता हूं? , लेकिन उस सवाल का हल सबवर्सन (के अनुसार svn help commit) के समान नहीं लगता है ।


26
मैं इस सवाल का जवाब देने जा रहा था, लेकिन तब मुझे एहसास हुआ कि मैं पहले से ही 4 महीने पहले किया था :)
oksayt

6
यदि यह कोड है, तो बस कुछ टिप्पणियां करें और उचित टिप्पणियों के साथ फिर से प्रतिबद्ध करें। यदि आप अपनी टिप्पणियों में गलती को दर्शाते हुए ठीक हैं, तो यह बहुत कम प्रयास और बहुत तेज है। यदि नहीं, तो कामिल किसिल द्वारा समाधान स्पष्ट रूप से इसे करने का सही तरीका है।
मार्टी

एक उत्कृष्ट pre-revprop-changeस्क्रिप्ट है जो प्रतिबद्ध उपयोगकर्ता को कमिट के बाद 3 घंटे तक अपने लॉग को संशोधित करने की अनुमति देता है। यह लचीलेपन / सटीक लॉग के बीच एक उत्कृष्ट समझौता है, और रिपॉजिटरी की निष्ठा बनाए रखने के लिए: wandisco.com/svnforum/threads/…
jwa

जवाबों:


457

ऐसा करने के लिए अनिवार्य रूप से आपके पास रिपॉजिटरी के लिए व्यवस्थापक अधिकार (प्रत्यक्ष या अप्रत्यक्ष रूप से) होना चाहिए। आप सभी उपयोगकर्ताओं को ऐसा करने की अनुमति देने के लिए या तो रिपॉजिटरी को कॉन्फ़िगर कर सकते हैं, या आप लॉग संदेश को सीधे सर्वर पर संशोधित कर सकते हैं।

तोड़फोड़ FAQ (जोर मेरा) के इस भाग को देखें :

लॉग संदेश रिपॉजिटरी में प्रत्येक संशोधन से जुड़े गुणों के रूप में रखे जाते हैं। डिफ़ॉल्ट रूप से, लॉग संदेश गुण (svn: log) को एक बार प्रतिबद्ध होने के बाद संपादित नहीं किया जा सकता है । ऐसा इसलिए है क्योंकि पुनरीक्षण गुणों में परिवर्तन (जिनमें से svn: log एक है) संपत्ति के पिछले मूल्य को स्थायी रूप से त्यागने का कारण बनता है, और सबवर्सन आपको गलती से ऐसा करने से रोकने की कोशिश करता है। हालाँकि, संशोधन संपत्ति को बदलने के लिए सबवर्सन प्राप्त करने के कुछ तरीके हैं।

पहला तरीका रिपॉजिटरी व्यवस्थापक के लिए पुनरीक्षण संपत्ति संशोधनों को सक्षम करने के लिए है। यह "प्री-रेवप्रॉप-चेंज" नामक एक हुक बनाने के द्वारा किया जाता है (इस अनुभाग को देखें कि यह कैसे करें के बारे में अधिक जानकारी के लिए तोड़फोड़ पुस्तक में देखें)। "प्री-रिवप्रॉप-चेंज" हुक को बदलने से पहले पुराने लॉग संदेश तक पहुंच है, इसलिए यह इसे किसी तरह से संरक्षित कर सकता है (उदाहरण के लिए, ईमेल भेजकर)। एक बार संशोधन संपत्ति संशोधन सक्षम हो जाने के बाद, आप svn propedit या svn propset - जैसे इन दोनों में से किसी एक में --revprop स्विच पास करके एक संशोधन का लॉग संदेश बदल सकते हैं:

$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 वह संशोधन संख्या है जिसके लॉग संदेश को आप बदलना चाहते हैं, और FILE एक फ़ाइल है जिसमें नया लॉग संदेश है। यदि "पूर्व-पुन: परिवर्तन-परिवर्तन" हुक जगह में नहीं है (या आप किसी कारण से हुक स्क्रिप्ट को बायपास करना चाहते हैं), तो आप --bypass-Hooks विकल्प का भी उपयोग कर सकते हैं। हालांकि, यदि आप इस विकल्प का उपयोग करने का निर्णय लेते हैं, तो बहुत सावधान रहें। आप परिवर्तन की ईमेल सूचनाओं या बैकअप सिस्टम के बारे में ऐसी बातों को दरकिनार कर सकते हैं जो संशोधन संपत्तियों पर नज़र रखते हैं।



1
यहाँ svnadmin विकल्प svn-
change-

2
धन्यवाद! जवाब के 6.5 साल बाद भी उपयोगी है। :-)
माइकल

प्रोपेडिट विधि कम या ज्यादा काम की है; हालाँकि, मुझे रेपो ब्राउज़र में प्रतिबिंबित करने के लिए लॉग परिवर्तन नहीं मिला। मैं केवल Windows में svn कमांड लाइन में अद्यतन लॉग देख सकता था। मुझे अंतिम चरण के रूप में लॉग कैश को रीफ्रेश करना था: stackoverflow.com/questions/25750249/…
user_007

89

जब आप यह कमांड चलाते हैं,

svn propedit svn:log --revprop -r NNN 

और यदि आप यह संदेश देखते हैं तो बस:

डीएवी अनुरोध विफल; यह संभव है कि रिपॉजिटरी का प्री-रेवप्रॉप-चेंज हुक या तो विफल हो गया या न के बराबर है

इसका कारण यह है कि तोड़फोड़ आपको लॉग संदेशों को संशोधित करने की अनुमति नहीं देता है क्योंकि वे अप्रकाशित हैं और स्थायी रूप से खो जाएंगे।

यूनिक्स-होस्ट एसवीएन

अपने तोड़फोड़ सर्वर पर हुक निर्देशिका पर जाएँ (~ / svn / रिपॉनामे को अपनी रिपॉजिटरी की निर्देशिका से बदलें)

cd ~/svn/reponame/hooks

एक्सटेंशन निकालें

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

इसे निष्पादित करें (chmod + x नहीं कर सकते हैं!)

chmod 755 pre-revprop-change

स्रोत

विंडोज-होस्ट एसवीएन

हुक निर्देशिका में टेम्पलेट फ़ाइलों का उपयोग नहीं किया जा सकता है क्योंकि वे यूनिक्स-विशिष्ट हैं। आपको pre-revprop-change.batहुक निर्देशिका में एक विंडोज बैच फ़ाइल को कॉपी करने की आवश्यकता है , जैसे कि यहां प्रदान किया गया


1
आपने कोष्ठक में क्यों लिखा है " चामोद + एक्स नहीं कर सकता !"।
प्रेरितों

1
मैंने एक छोटी सी स्क्रिप्ट बनाई है जो समान विचार यहाँ लागू करती है। blog.mmonem.com/enable-changing-svn-log
mmonem

SVN_EDITOR, VISUAL या EDITOR को svn propedit
Gerd

48

यहाँ एक आसान भिन्नता है जिसे मैं faq में नहीं देखता हूँ। आप पाठ संपादक को निर्दिष्ट करके संपादन के लिए वर्तमान संदेश वापस कर सकते हैं।

svn propedit svn:log --revprop -r N --editor-cmd vim

17
इसके लिए आवश्यक है कि हुक बनाया गया हो - जिसके लिए व्यवस्थापक अधिकारों की आवश्यकता होती है। svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
मैट

यहाँ लॉग को सक्षम करने के लिए एक स्क्रिप्ट है: blog.mmonem.com/enable-changing-svn-log
mmonem

37
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt

मैं Google कोड का उपयोग कर रहा हूं इसलिए मुझे नहीं लगता कि मैं इसे इस तरह से कर सकता हूं, लेकिन धन्यवाद।
जेरेमी रुटेन

4
यह मेरे लिए काम किया क्योंकि प्रोपेडिट विधि "रिपॉजिटरी को संशोधन प्रस्ताव को स्वीकार करने में सक्षम नहीं किया गया" के साथ विफल रही। धन्यवाद!
pfctdayelise

1
+1 सीधे कमांड देने के लिए :-) apache.org अभी नीचे था और मैं किसी दिए गए लिंक का पालन नहीं कर सकता था ...
राफा

यह उत्तर अधिक अंक का हकदार है! यह बेहतर है क्योंकि आपको हुक का उपयोग करने की आवश्यकता नहीं है।
पेरी हार्टमैन

1
इस उत्तर के लिए टकराए, हुक की स्थापना के बिना मेरे लिए काम किया, लॉग में संशोधन "तिथि / समय" को भी नहीं बदला, बस संदेश, जो वास्तव में मुझे उम्मीद थी।
segFaultCoder

17

मुझे हाल ही में यह काम सौंपा गया था।

हम अपने प्रोग्रामरों को केवल अपने स्वयं के प्रतिबद्ध संदेशों को संशोधित करने की अनुमति देना चाहते थे, और यह भी सीमित कर सकते हैं कि उन्हें ऐसा करने की अनुमति कितनी दूर है। हमने तय किया कि उन्हें टाइपो आदि को ठीक करने के लिए उस दिन किए गए किसी भी लॉग संदेश को संशोधित करने की अनुमति दी जाएगी।

कुछ अन्य उदाहरणों को ऑनलाइन देखने के बाद मैंने इसे एक साथ हैक किया, हम एक विंडोज़ वातावरण में हैं, इसलिए यह हमारी सामग्री है 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 

संपादित करें: इसके लिए मूल विचार इस धागे से आया है :


7
किसी कारण से, मेरे सिस्टम पर (सर्वर 2012 और VisualSVN चल रहा है), अंतिम तिथि की जांच में if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD, मुझे दो चर के आसपास दोहरे उद्धरण चिह्नों पर स्विच करना पड़ा। (आपको विश्वास नहीं होगा कि यह पता लगाने में कितना समय लगा।) अन्यथा मुझे इस समय "== '02' जैसी चीजें अप्रत्याशित होंगी" (महीने के दूसरे दिन)। ऐसा क्यों होता है, यह जानने के लिए मेरा बैच-फू काफी मज़बूत नहीं है, लेकिन यदि कोई अन्य व्यक्ति अजीब समस्याओं में भागता है, तो यह मदद कर सकता है।
कार्ल बुसेमा

@CarlBussema: उस tidbit के लिए धन्यवाद। आपने मुझे बहुत बड़ा सिरदर्द होने से बचाया।
डैनियल स्जाबो

1
यह भी ध्यान दें कि उपरोक्त स्क्रिप्ट अमेरिकी तिथि प्रारूप का उपयोग करती है, "प्रारूप में दिनांक की उम्मीद: थू 08/01/2013" । इसलिए यदि आप उस भाग को संशोधित करने की आवश्यकता नहीं रखते हैं, तो मेरे मामले में प्रारूप "mm.dd.yy" था, और सप्ताह के दिन के बिना।
Zitrax

यह अच्छा जवाब पर एक शांत बदलाव है: stackoverflow.com/questions/6155/…
NateJ

17

विंडोज पर, कछुआ SVN क्लाइंट का उपयोग कर:

  1. अपने प्रोजेक्ट फ़ोल्डर में राइट क्लिक करें और "शो लॉग" चुनें
  2. लॉग संदेश विंडो में, एक संशोधन पर राइट क्लिक करें और "लॉग संदेश संपादित करें" चुनें

यदि सर्वर पर सेटअप करने के तरीके के कारण यह काम नहीं करता है, तो अन्य प्रतिक्रियाओं को यहां पढ़ें।


धन्यवाद यह मेरे लिए एक आसान समाधान था, +1। अनुमतियाँ होना आवश्यक है।
TheGabyRod

12

यदि आप ग्रहण की तरह एक आईडीई का उपयोग कर रहे हैं, तो आप इस आसान तरीके का उपयोग कर सकते हैं।

Right click on the project -> Team - Show history

उस में right click on the revision id for your commit and select 'Set commit properties'

आप यहां से जैसा चाहें वैसा संदेश संशोधित कर सकते हैं।


कम से कम TortoiseSVN में, कमिट लॉग में कमिट के लिए कमिटेड प्रॉपर्टीज को एडिट करने की कोशिश करने में उसी एरर मैसेज के साथ फेल हो जाता है जैसे लॉग मैसेज को सीधे एडिट करने की कोशिश की जाती है।
क्रिश्चियन सेवेरिन

1
"डीएवी अनुरोध विफल रहा; यह संभव है कि रिपॉजिटरी का पूर्व-पुन: परिवर्तन-परिवर्तन हुक या तो विफल रहा है या गैर-मौजूद है रिपॉजिटरी को पुनरीक्षण प्रस्ताव को स्वीकार करने में सक्षम नहीं किया गया है, प्रशासक से पूर्व-रिवप्रॉप-परिवर्तन हुक बनाने के लिए कहें"। लेकिन जैसा कि मैंने कहा: कि TortoiseSVN (एक गैर-व्यवस्थापक के रूप में) का उपयोग कर रहा है, ग्रहण का नहीं। शायद ग्रहण उस हुक को बनाने के लिए SVN अनुमतियों को हैक कर लेता है, मुझे नहीं पता।
क्रिश्चियन सेवेरिन

हाँ शायद। इसे ग्रहण में करने की कोशिश करें।
mani_nz

@ChristianSeverin, मुझे ग्रहण का उपयोग करते समय एक ही त्रुटि संदेश मिलता है। यह निश्चित रूप से तोड़फोड़ सर्वर से आता है।
ग्रीनहाउस

10

यदि आपकी रिपॉजिटरी प्री-रेवप्रॉप-चेंज हुक के माध्यम से रिविजन गुण सेट करने में सक्षम बनाती है तो आप लॉग संदेशों को बहुत आसान बदल सकते हैं।

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

या फिर TortoiseSVN, AnkhSVN और शायद कई अन्य तोड़फोड़ करने वाले क्लाइंट एक लॉग एंट्री पर राइट क्लिक करके और फिर 'लॉग मैसेज बदल दें'।


2
Subclipse (ग्रहण) में यह "सेट प्रतिबद्ध गुण" है।
pfctdayelise

2

सबवर्सन पूछे जाने वाले प्रश्न इस को शामिल किया गया है, लेकिन जैसे अपरिभाषित संदर्भ भ्रामक का एक समूह का उपयोग करता है REPOS_PATHकिसी भी वास्तविक उदाहरण दिए बिना।

इसे काम में लाने के लिए कुछ प्रयास करने की आवश्यकता हो सकती है, इसलिए किसी फ़ाइल में अपने अद्यतन किए गए संदेश को सहेजें। svn-commit.tmpयदि कोई समस्या है, तो फ़ाइलों के विपरीत , सबवर्सन आपकी टाइपिंग को संरक्षित नहीं करेगा।

अपनी कार्यशील निर्देशिका में, चलाएं

svn propedit -r N --revprop svn:log

प्रतिबद्ध संदेश को संपादित करने के लिए। अगर वह काम करता है, महान! लेकिन यह संभवत: नहीं होगा, क्योंकि svn:logसंशोधन की संपत्ति असंबद्ध है और डिफ़ॉल्ट रूप से तोड़फोड़ आपको इसे ओवरराइट करने से रोक देगी, या तो हुक स्क्रिप्ट pre-revprop-change , या एक त्रुटि संदेश के साथ आपके पास ऐसा हुक नहीं होगा।

हुक को बदलने के लिए, आपको उस फाइल सिस्टम तक पहुंच की आवश्यकता होती है जिस पर रिपॉजिटरी होस्ट की जाती है। svn infoआपको रिपॉजिटरी रूट बताएगा। मान लो ~/svnrepo

  1. cd सेवा ~/svnrepo/hooks
  2. कोई स्क्रिप्ट है pre-revprop-changeया नहीं pre-revprop-change.bat? यदि ऐसा है, तो अस्थायी रूप से उस हिस्से को टिप्पणी करें जो बदलने की कोशिश करने पर गर्भपात करता है svn:log
  3. अन्यथा, विंडोज पर, नामक एक खाली फ़ाइल बनाएं 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) में अपने परिवर्तन पूर्ववत करें

0

मुझे svnforum में सर्वर साइड प्री-रेव-प्रोप-चेंज हुक का एक अच्छा कार्यान्वयन मिला: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -shell-पटकथा की अनुमति देता है-commiters-टू-परिवर्तन-खुद-लॉग-भीतर-एक्स-घंटे

यह लागू होता है

  • उपयोगकर्ता की जाँच, कि केवल स्वयं के प्रतिबद्ध संदेश संपादित किया जा सकता है।
  • Svn व्यवस्थापक ओवरराइड; एडमिन कुछ भी एडिट कर सकता है।
  • समय की तुलना टिकट: केवल वह करता है जो कुछ समय से कम उम्र का हो सकता है

इसे वहां से पकड़ें और वसीयत में संपादित करें। मैं इसे यहां कॉपी नहीं करूंगा क्योंकि मैं मूल लेखक नहीं हूं और कोई कॉपीराइट नोटिस नहीं है जो मुझे ऐसा करने की अनुमति देगा।

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