Tim:
您可以試試這個python鉤子腳本。它是(鬆散地)基於上述一個,但允許正則表達式模式的拒絕路徑,並允許通過具有開始
在此改變的線重寫檢查:在日誌消息
。它使用新的Python打印語法,因此它需要一個相當新的Python版本(2.6+?)。
from __future__ import print_function
import sys,os
import subprocess
import re
#this is a list of illegal patterns:
illegal_patterns = [
'\.exe$',
'\.dll$',
'[\^|/]bin/',
'[\^|/]obj/',
]
# Path to svnlook command:
cmdSVNLOOK=r"{}bin\svnlook.exe".format(os.environ["VISUALSVN_SERVER"])
print(illegal_patterns, file=sys.stderr)
print("cmdSVNLook={}".format(cmdSVNLOOK), file=sys.stderr)
def runSVNLook(subCmd, transact, repoPath):
svninfo = subprocess.Popen([cmdSVNLOOK, subCmd, '-t', transact, repoPath],
stdout = subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = svninfo.communicate()
if len(stderr) > 0:
print("svnlook generated stderr: " + stderr, file=sys.stderr)
sys.exit(1)
return [ line.strip() for line in stdout.split("\n") ]
def findIllegalPattern(fileName):
for pattern in illegal_patterns:
if re.search(pattern, fileName):
print("pattern: {} matched filename:{}".format(pattern, fileName))
return pattern
return None
def containsOverRide(logOutput):
retVal = False
for line in logOutput:
print("log line: {}".format(line), file=sys.stderr)
if re.match("^override:", line.lower()):
retVal = True
break
print("contiansOverRide={}".format(retVal), file=sys.stderr)
return retVal
def findIllegalNames(changeOutput):
illegalNames = []
prog = re.compile('(^[ACUDRM_])[ACUDRM]*\s+(.+)') # regex for svnlook output
for line in changeOutput:
print("processing:{}".format(line), file=sys.stderr)
if (line != ""):
match=re.search(prog, line.strip())
if match:
mode = match.group(1)
ptFilename = match.group(2)
if mode == 'A':
pattern = findIllegalPattern(ptFilename)
if pattern:
illegalNames.append((pattern, ptFilename))
else:
print("svnlook output parsing failed!", file=sys.stderr)
sys.exit(1)
return illegalNames
######### main program ################
def main(args):
repopath = args[1]
transact = args[2]
retVal = 0
overRidden = containsOverRide(runSVNLook("log", transact, repopath))
illegalFiles = findIllegalNames(runSVNLook("changed", transact, repopath))
if len(illegalFiles):
msg = "****************************************************************************\n"
if len(illegalFiles) == 1:
msg += "* This commit contains a file which matches a forbidden pattern *\n"
else:
msg += "* This commit contains files which match a forbidden pattern *\n"
if overRidden:
msg += "* and contains an Override line so the checkin will be allowed *\n"
else:
retVal = 1
msg += "* and is being rejected. *\n"
msg += "* *\n"
msg += "* Files which match these patterns are genreraly created by the *\n"
msg += "* built process and should not be added to svn. *\n"
msg += "* *\n"
msg += "* If you intended to add this file to the svn repository, you neeed to *\n"
msg += "* modify your commit message to include a line that looks like: *\n"
msg += "* *\n"
msg += "* OverRide: <reason for override> *\n"
msg += "* *\n"
msg += "****************************************************************************\n"
print(msg, file=sys.stderr)
if len(illegalFiles) == 1:
print("The file and the pattern it matched are:", file=sys.stderr)
else:
print("The files and the patterns they matched are:", file=sys.stderr)
for (pattern, fileName) in illegalFiles:
print('\t{}\t{}'.format(fileName, str(pattern)), file=sys.stderr)
return retVal
if __name__ == "__main__":
ret = main(sys.argv)
sys.exit(ret)
那麼,有三個答案如此之間的選擇是非常迅速和不可能的,我相信一個示例腳本可以確保'接受'狀態:) – 2010-01-29 22:53:01
如何規範你的用戶?並非每種解決方案都是技術性的, – 2010-01-29 22:56:53
@Lasse:我同意,但實際上我發現這有助於防止*自己*意外*將二進制文件夾入SVN存儲庫(即在新機器上設置Tortoise並忘記添加「bin」和「 obj「例外) – Aaronaught 2010-01-29 23:01:28