Svn 用于阻止大于20MB的提交的预提交挂钩
是否可以为SVN 1.8编写prcommit钩子,以避免提交大于~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
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的文件。如果目标是防止提交真正大的文件,那么你就不需要总计。忽略:infilesize
命令您缺少$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