Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Svn 用于阻止大于20MB的提交的预提交挂钩_Svn_Hook - Fatal编程技术网

Svn 用于阻止大于20MB的提交的预提交挂钩

Svn 用于阻止大于20MB的提交的预提交挂钩,svn,hook,Svn,Hook,是否可以为SVN 1.8编写prcommit钩子,以避免提交大于~20MB的文件。如有任何建议,将不胜感激。谢谢 我尝试过这个,但它不适用于二进制文件或其他文件扩展名 filesize=$($SVNLOOK cat -t $TXN $REPOS $f|wc -c) if [ "$filesize" -gt "$MAX_SIZE"] then echo "File $f is too large(must <=$MAX_SIZE)" >&2 exit 1 fi

是否可以为SVN 1.8编写prcommit钩子,以避免提交大于~20MB的文件。如有任何建议,将不胜感激。谢谢 我尝试过这个,但它不适用于二进制文件或其他文件扩展名

filesize=$($SVNLOOK cat -t $TXN $REPOS $f|wc -c)
if [ "$filesize" -gt "$MAX_SIZE"]
then
    echo "File $f is too large(must <=$MAX_SIZE)" >&2
    exit 1
fi
filesize=$($SVNLOOK cat-t$TXN$REPOS$f|wc-c)
如果[“$filesize”-gt“$MAX_SIZE”]
然后

echo“文件$f太大(必须读取
svnlook帮助

使用
svnlook已更改
+
svnlook文件大小

懒汉的解释

$SVNLOOK filesize-t$TXN$REPOS$f
将“…打印位于$f的文件大小(以字节为单位)”

测试回购头状态的样本

>svnlook filesize Repo trunk/ADExplorer.exe
479096
如果要在预提交钩子中检查事务中的每个文件,必须:

获取事务中所有对象的列表(
svnlook已更改-t…

从列表中跳过所有非文件实体,因为

>svnlook filesize Repo trunk/Hlp/
svnlook: E160017: Path 'trunk/Hlp' is not a file

将纯文件列表中的每个对象传递到
svnlook filesize
并测试返回的编号您需要在这里做两件事:

  • 首先使用
    svn-t$TXN changed
    获取事务中更改的路径。您需要筛选出目录,这些目录将是
    svn changed
    返回的以
    /
    结尾的任何行
  • 对于
    svn changed
    中的每个条目,您需要对其运行
    svn-t$TXN filesize file
    。然后汇总文件更改
类似这样的东西。这不是经过测试的,但应该给你一个想法:

total=0
svnlook -t $TXN changed | while read status file
do
    [[ status == "D" ]] && continue  # Ignore deletions
    [[ $file == */ ]] && continue    # Skip directories
    size=$(svnlook -t $TXN filesize $REPOS $file)
    ((total+=size))
done
if [[ $total -gt $maxsize ]]
then
    echo "Commit is too big!" >&2
    exit 1
else
    exit 0
fi
但是,我不喜欢使用shell来编写钩子脚本。相反,您应该使用真正的脚本语言,如Python或Perl。它们更易于使用,功能更强大,更灵活

为什么你必须过滤掉这些大提交?你是否让开发人员尝试提交他们刚刚构建的可执行文件


Lazy badger指出,您所说的不是总提交大小,而是一个这么大的文件。如果是这样,您可以使用类似的钩子,但不使用总提交大小:

svnlook -t $TXN changed | while read status file
do
    [[ $status == "D" ]] && continue  # Skip Deletions
    [[ $file == */ ]] && continue     # Skip directories
    size=$(svnlook -t $TXN filesize $REPOS $file)
    if [ $size -gt $maxsize ]]
    then
        echo "File '$file' too large to commit" >&2
        exit 2
    fi
done
exit 0

当任务是检查传入事务的大小时,使用
svnlook
分析文件大小并不总是最好的方法。您的存储库可能已经有了“大型”文件“文件和用户可能正在提交更改。在预提交钩子脚本中不使用任何特殊逻辑而使用
svnlook filesize
将拒绝对这些文件的修改

为了避免此类问题,检查磁盘上传入事务的大小如何?下面是一个在PowerShell中编写的预提交钩子脚本示例。它检查
$repos\db\txn protorevs\$txn.rev
中传入事务的总大小,如果大于100MB,则拒绝提交

预提交.ps1

#将钩子参数存储到具有助记名称的变量中
$repos=$args[0]
$txn=$args[1]
#以字节为单位设置提交大小限制
$limit=1000000
#准备错误消息
$errortxt=(“禁止大于100MB的提交。”)
#检查$txn.rev文件的大小,如果大于$limit,则拒绝提交
$item=获取项目“$repos\db\txn protorevs\$txn.rev”
如果($item.Length-gt$限制){
[控制台]::Error.WriteLine($errortxt)
出口3
}
出口0
在PowerShell中编写的钩子脚本应从Windows批处理脚本启动。以下是一个示例:

预提交.bat

set PWSH=%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
%PWSH%-命令$input^ |%1\hooks\pre-commit.ps1%1%2
如果errorlevel 1退出%errorlevel%

这个问题的当前答案在我们的svn服务器上不起作用。在此期间,subversion可能发生了一些变化

这就是我们的
post-commit
钩子的配置方式:

REPOS="$1"
REV="$2"
MAXSIZE=1048576

# we don't want anyone to know if something went wrong
svnlook changed -r $REV $REPOS | while read status file
do
  [[ $status == "D" ]] && continue  # Skip Deletions
  [[ $file == */ ]] && continue     # Skip directories
  size=$(svnlook filesize -r $REV $REPOS $file)
  if [ $size -gt $MAXSIZE ]]
  then
    #do something if the file is larger than MAXSIZE, in our case just write that file, size and revision to a file
    echo "File '$file' with size '$size' too large to commit.REV: '$REV'" >/tools/svnrepos/file-commits-big-size.txt
  fi
done

对你的字面问题的回答:是的。你到底在问什么?例如,你尝试了什么?什么给你带来了麻烦?是的,我尝试了,但没有成功,我应该使用“svnlook changed”吗命令,然后计算svnlook的每个输出的文件大小。请指导您尝试了什么?什么没有成功?您期望发生什么,以及发生了什么?或者,您的脚本需要做什么,您在计算如何实现这一点时遇到了困难?@Ben:编辑了我的问题。请提示我不知道我的问题是什么计算被降级,这不是一种专业的方式。必须有人给一个机会来修改问题。而且,你不能期望每个人在任何事情上都是专业的。Svnlook changed提供在svn中提交且与文件大小相同的文件更改。我认为我们不应该在这里使用文件大小,因为文件未提交。他会提供任何详细的帮助感谢。@Kaku-RTFM!!!任何svnlook子命令都可以与
-t
参数一起用于事务(在预提交阶段),其中事务的对象不属于历史yet1。
svnlook
,而不是
svn
2。我认为$total不是一个好主意(可以使用大量小文件进行超大有效提交),因为“犯下巨大的错误"可能是钩子的任务关于
svnlook
你是对的。很难看出OP试图阻止什么。从OP的初始钩子来看,目标是防止提交大于20Mb的文件。如果目标是防止提交真正大的文件,那么你就不需要总计。忽略:in
filesize
命令您缺少$REPOS参数:
svnlook-t$TXN filesize$REPOS$file
必须是最终正确的syntax@Brandon-您建议对该答案进行编辑,作为其自己的答案会更好。
REPOS="$1"
REV="$2"
MAXSIZE=1048576

# we don't want anyone to know if something went wrong
svnlook changed -r $REV $REPOS | while read status file
do
  [[ $status == "D" ]] && continue  # Skip Deletions
  [[ $file == */ ]] && continue     # Skip directories
  size=$(svnlook filesize -r $REV $REPOS $file)
  if [ $size -gt $MAXSIZE ]]
  then
    #do something if the file is larger than MAXSIZE, in our case just write that file, size and revision to a file
    echo "File '$file' with size '$size' too large to commit.REV: '$REV'" >/tools/svnrepos/file-commits-big-size.txt
  fi
done