SVN(服务器 - 预提交挂钩):了解正在提交的文件列表

时间:2013-07-22 14:43:37

标签: svn

我想知道如何获取在预提交挂钩上提交的文件列表。

如果该列表不包含特定路径中的特定文件,那么我想拒绝提交。

2 个答案:

答案 0 :(得分:14)

钩子脚本应该使用svnlook命令而不是svnsvnlook命令可以获取提交的事务编号(如果这是预提交挂钩,则需要使用事务编号。如果这是一个提交后挂钩,那么你需要修订号。)

执行svnlook -h查看所有子命令。这是一个列表:

  • author - 检索提交者的用户ID
  • cat - 打印出指定的文件
  • changed - 打印出已更改的文件和目录
  • date - 打印出提交的时间戳
  • diff - 打印出所有文件的差异
  • dirs-changed - 打印出更改的目录(
  • filesize - 以字节“
  • 打印出文件大小
  • history - 打印历史记录(更像svn log
  • info - 打印出文件的信息
  • lock - 打印出锁定信息
  • propget - 获取特定属性。
  • proplist - 列出所有属性。
  • tree - 打印出目录结构
  • uuid - 打印出存储库的UUID
  • youngest - 打印出最后一个修订号。

看起来svnlook changed就是你想要的。

关于svnlook 的两件非常重要的事情:

  1. svnlook命令无法更改任何数据,只需显示即可。有些人希望了解如何使用svnlook更改属性值。答案,你不能。
  2. svnlook存储库目录位置作为参数,而不是存储库的URL。这意味着svnlook只能在服务器上运行。

答案 1 :(得分:13)

在预提交中使用svnlooksvnlook changed给出了更改的提交路径。将此与您的列表进行比较。如果发现/找不到路径,则拒绝它。预先提交的一个简单示例可能是。

#!/bin/sh

REPOS="$1"
TXN="$2"
SPATH="specific/path"
FOUND=$(svnlook changed -t "$TXN" "$REPOS" | tr -d '\n' | grep -E ".*$SPATH.*")

if [ "$FOUND" != "" ]
then
    echo "Reject commit!" 1>&2 && exit 1
else 
    exit 0
fi

在这里,我删除了感兴趣路径的换行符和grep。如果未找到路径,则重新提交提交exit 1。用户将看到你回应的内容。