11

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

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

4

2 回答 2

14

钩子脚本应该使用svnlookcommand 而不是svn. 该svnlook命令可以取提交的事务号(如果这是一个 pre-commit 钩子,则需要使用事务号。如果这是一个 post-commit 钩子,则需要修订号)。

执行 asvnlook -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只能在服务器本身上运行。
于 2013-07-22T17:44:34.003 回答
13

svnlook在预提交中 使用。svnlook 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。用户将看到您在那里回显的内容。

于 2013-07-22T15:29:04.217 回答