एसवीएन में एक पूर्व-पुन: परिवर्तन-परिवर्तन हुक क्या है, और मैं इसे कैसे बना सकता हूं?


168

मैं रिपॉजिटरी ब्राउज़र में एक लॉग टिप्पणी को संपादित करना चाहता था और एक त्रुटि संदेश प्राप्त किया कि रिपॉजिटरी के लिए कोई पूर्व-पुन: परिवर्तन-परिवर्तन हुक मौजूद नहीं है। एक डरावना नाम होने के अलावा, पूर्व-पुन: परिवर्तन-परिवर्तन हुक क्या है, और मैं इसे कैसे बना सकता हूं?


16
अब यह लिंक दूसरा है, इस सवाल के लिंक के बाद ही :)
ULysses

इस लिंक के बारे में बहुत पुराना है SVNBook 1.0। वर्तमान में 1.7 और 1.8 (रात): svnbook.red-bean.com/en/1.8
bahrep

जवाबों:


52

मूल रूप से यह एक ऐसी स्क्रिप्ट है जिसे पहले से बिना फैली हुई संपत्ति पर रिपॉजिटरी में संशोधित किया गया है, ताकि आप अधिक से अधिक प्रबंधन कर सकें कि आपकी रिपॉजिटरी में क्या हो रहा है।

एसवीएन डिस्ट्रीब में अलग-अलग हुक के लिए टेम्प्लेट होते हैं, जो / हुक सबडायरेक्ट में स्थित होते हैं (* .tmpl जिसे आपको अपने ओएस पर निर्भर करते हुए संपादित और नाम बदलना पड़ता है, सक्रिय करने के लिए)।


2
सभी निर्देश हुक टेम्पलेट स्क्रिप्ट में हैं। यदि आपको svnsyncदर्पण के लिए हुक की आवश्यकता है , तो डिफ़ॉल्ट स्क्रिप्ट को बदलना होगा, क्योंकि यह केवल svn: लॉग में परिवर्तन की अनुमति देता है। Svnsync इससे अधिक बदलता है, इसलिए मैं exit 0सभी संपत्ति परिवर्तन की अनुमति देने के लिए बस वहां डाल देता हूं (क्योंकि यह केवल मेरे लिए एक दर्पण है)।
मैट कॉनॉली

... फिर इसे pre-revprop-changeउसी निर्देशिका के रूप में सहेजें और इसे वेब सर्वर उपयोगकर्ता (लिनक्स पर) के लिए निष्पादन योग्य बनाएं।
मटेंगू

209

विंडोज के लिए, यहां एक उदाहरण बैच फ़ाइल का लिंक दिया गया है जो केवल लॉग संदेश (अन्य गुण नहीं) में परिवर्तन की अनुमति देता है:

http://ayria.livejournal.com/33438.html

मूल रूप से एक पाठ फ़ाइल में नीचे दिए गए कोड को कॉपी करें और इसे नाम दें pre-revprop-change.batऔर इसे \hooksअपनी रिपॉजिटरी के लिए उपनिर्देशिका में सहेजें ।

@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5

:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME

:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION

:: Make sure that the new svn:log message is not empty.
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 messages are not allowed. >&2
goto ERROR_EXIT

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

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

:ERROR_EXIT
exit /b 1

37
वहाँ के संस्करण से जुड़ा हो सकता है stackoverflow.com/questions/6155/… । मैंने उस हुक को लिखा और थोड़ी देर पहले इसे एसवीएन फोरम पर पोस्ट किया। मुझे लगता है कि मुझे हुक टिप्पणियों में कुछ क्रेडिट डालना चाहिए था।
फिलाबर्ट पेरुसे

1
मैं VisualSVN 2.0.8 और TortoiseSVN 1.6.11 के साथ इस स्क्रिप्ट का उपयोग कर रहा हूं और यह अच्छी तरह से काम करता है।
मार्क बेसिक

27
आप VisualSVN सर्वर में अपना रिपॉजिटरी नाम राइट-क्लिक करके और "गुण ..." का चयन करके VisualSVN में हुक संपादित कर सकते हैं। आपको एक "हुक" टैब दिखाई देगा। वहां आपको विभिन्न प्रकार के हुक उपलब्ध होंगे। सही एक का चयन करें, "संपादित करें" पर क्लिक करें और इसमें उपरोक्त कोड पेस्ट करें। उम्मीद है कि VisualSVN उपयोगकर्ताओं की मदद करता है!
चक ले बट

मेरे लिए अक्षम लाइन में काम किया: अगर / मैं "% कार्रवाई%" == "एम" नहीं मिला, तो ERROR_ACTION। दूसरे तरीके से, यह केवल संशोधनों की अनुमति देता रहा।
नाथन

6
खिड़कियों के लिए त्वरित और गंदी विधि एक खाली फ़ाइल बनाने के लिए है जिसे हुक \ _ रेवप्रॉप-चेंज-बट कहा जाता है
बेन

18

लिनक्स के लिए एक लॉग टिप्पणी के संस्करण की अनुमति देने के लिए,

  • अपनी रिपॉजिटरी pre-revprop-change.tmplकी hooksडायरेक्टरी में फाइल का पता लगाएं
  • फ़ाइल को उसी निर्देशिका में कॉपी करें, उसका नाम बदलकर pre-revprop-change
  • फ़ाइल को अनुमति दें (सर्वर उपयोगकर्ता के लिए, उदाहरण के लिए www-data)

संपादित: (lindes के लिए धन्यवाद)

  • उसके बाद आपको 0उस तरह के संपादन के लिए बाहर निकलने के मूल्य को वापस करने के लिए स्क्रिप्ट को संपादित करना पड़ सकता है , जिसे आप अनुमति देना चाहते हैं।

यह अपर्याप्त है ... एक अभी भी बाहर निकलने के मूल्यों को उचित रूप से बदलने की आवश्यकता है। लेकिन मैंने इसे वैसे भी मददगार पाया, जैसा कि देखने के लिए सही जगह पर एक संकेतक के रूप में ... जो कि कुछ अन्य उत्तरों की कमी थी, या विंडोज़-विशिष्ट उत्तर देने के लिए। तो इसके लिए धन्यवाद।
lindes

1
मुझे पूरा यकीन है, मेरे उबंटू लिनक्स संस्करण में नकल करना और अनुमति देना पर्याप्त था। लेकिन मुझे यकीन नहीं है। मैंने उसी के अनुसार उत्तर संपादित किया है। धन्यवाद।
Alois Heimer

खैर, मुझे यकीन है कि यह मेरे लिए काम नहीं कर रहा है, जब मैंने 2 दिन पहले इसकी कोशिश की थी, और इस टिप्पणी को जोड़ा। संपादन के साथ, हालांकि, यह जवाब मेरे लिए काम करता है।
lindes

11

यहां विंडोज क्रॉस के लिए हुक के मूल स्रोत सहित कई सामान्य हुक सामान्य प्रकार के तोड़फोड़ हुक के साथ स्टैक ओवरफ्लो प्रश्न का लिंक दिया गया pre-revprop-changeहै।

आपको वहाँ का संदर्भ देना चाहिए क्योंकि वे समय के साथ बेहतर हो सकते हैं।


7

साभार #patmortech

और मैंने आपका कोड जोड़ा "जो केवल वही उपयोगकर्ता अपना कोड बदल सकता है"।

:: Only allow editing of the same user.
for /f "tokens=*" %%a in ( 
'"%VISUALSVN_SERVER%\bin\svnlook.exe" author -r %revision% %repository%') do ( 
set orgAuthor=%%a
)
if /I not "%userName%" == "%orgAuthor%" goto ERROR_SAME_USER

4

हुक स्क्रिप्ट का नाम इतना डरावना नहीं है यदि आप इसे समझने का प्रबंधन करते हैं: यह पूर्व संशोधन संपत्ति परिवर्तन हुक है । संक्षेप में, pre-revprop-changeहुक स्क्रिप्ट का उद्देश्य असंबद्ध (संशोधन) संपत्तियों के परिवर्तनों को नियंत्रित करना और सूचनाएं भेजना है (जैसे संशोधन संपत्ति में बदलाव होने पर ईमेल भेजने के लिए)।

तोड़फोड़ में 2 प्रकार के गुण हैं:

  • संस्करण गुण (जैसे svn:needs-lockऔर svn:mime-type) जो फ़ाइलों और निर्देशिकाओं पर सेट किए जा सकते हैं,
  • असंबद्ध (संशोधन) गुण (जैसे svn:logऔर svn:date) जो रिपॉजिटरी संशोधन पर सेट किए गए हैं ।

संस्करणित गुणों का इतिहास होता है और उन सामान्य उपयोगकर्ताओं द्वारा चालाकी से किया जा सकता है जिनके पास भंडार को पढ़ने / लिखने की सुविधा है। दूसरी ओर, असंबद्ध गुणों का कोई इतिहास नहीं है और ज्यादातर रखरखाव के उद्देश्य हैं। उदाहरण के लिए, यदि आप एक संशोधन करते हैं तो यह तुरंत svn:dateआपके कमिट के UTC समय के svn:authorसाथ , आपके उपयोगकर्ता नाम और svn:logआपके कमिट मैसेज संदेश के साथ (यदि आपने कोई निर्दिष्ट किया है) हो जाता है।

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

सबसे सरल हुक में केवल एक पंक्ति हो सकती है exit 0:। यह किसी भी प्रमाणित उपयोगकर्ता को किसी भी संशोधन संपत्ति को बदलने की अनुमति देगा और इसका वास्तविक वातावरण में उपयोग नहीं किया जाना चाहिए। विंडोज पर, आप pre-revprop-changeहुक के भीतर कुछ तर्क को लागू करने के लिए बैच स्क्रिप्ट या पावरशेल-आधारित स्क्रिप्ट का उपयोग कर सकते हैं ।

यह पॉवरशेल स्क्रिप्ट svn:logकेवल संपत्ति बदलने की अनुमति देता है और खाली लॉग संदेशों से इनकार करता है।

# Store hook arguments into variables with mnemonic names
$repos    = $args[0]
$rev      = $args[1]
$user     = $args[2]
$propname = $args[3]
$action   = $args[4]

# Only allow changes to svn:log. The author, date and other revision
# properties cannot be changed
if ($propname -ne "svn:log")
{
  [Console]::Error.WriteLine("Only changes to 'svn:log' revision properties are allowed.")
  exit 1
}

# Only allow modifications to svn:log (no addition/overwrite or deletion)
if ($action -ne "M")
{
  [Console]::Error.WriteLine("Only modifications to 'svn:log' revision properties are allowed.")
  exit 2
}

# Read from the standard input while the first non-white-space characters
$datalines = ($input | where {$_.trim() -ne ""})
if ($datalines.length -lt 25)
{
  # Log message is empty. Show the error.
  [Console]::Error.WriteLine("Empty 'svn:log' properties are not allowed.")
  exit 3
}

exit 0

यह बैच स्क्रिप्ट केवल "svnmgr" उपयोगकर्ता को संशोधन गुण बदलने की अनुमति देता है:

IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )

exit 1
goto :eof

:label1
exit 0

2

पीसी उपयोगकर्ताओं के लिए: विंडोज सर्वर मचिंग पर उपयोग किए जाने पर .bat एक्सटेंशन ने मेरे लिए काम नहीं किया। मैंने Django Reinhardt के सुझाव के अनुसार VisualSvn का उपयोग किया, और इसने एक .cmd एक्सटेंशन के साथ एक हुक बनाया।


0
  1. एसवीएन रेपो निर्देशिका में सबफ़ोल्डर "हुक" में जाएं, जैसे "डी: \ एसवीएन \ हुक \"
  2. वहां खाली फाइल "प्री-रिवप्रॉप-चेंज.बैट" बनाएं
  3. फ़ाइल में "बाहर निकलें 0" ("बिना") लिखें और इसे सहेजें
  4. का आनंद लें :)

(इस समाधान में निश्चित रूप से कमियां हैं, क्योंकि कुछ भी चेक / निषिद्ध नहीं है। लेकिन मेरे मामले के लिए - एक स्थानीय रेपो जो केवल मैं उपयोग कर रहा हूं - यह काम करने लगता है।)

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