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

11

我想知道如何在 pre-commit 钩子中获取正在提交的文件列表。

如果该列表不包含特定路径下的特定文件,则我希望拒绝该次提交。

2个回答

15
  • svnlook命令应该被钩子脚本使用而不是svn。如果这是一个预提交钩子,你需要使用提交的事务号;如果这是一个后提交钩子,则需要使用修订版本号。
  • 运行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命令而不是svn
    2. 如果这是预提交钩子,则需要使用提交的事务号;如果这是后提交钩子,则需要使用修订版本号。
  • svnlook命令不能更改任何数据,只能显示数据。有人想知道如何使用svnlook更改属性值。答案是你不能。
  • svnlook仓库目录位置为参数,而不是仓库的URL。这意味着svnlook只能在服务器上运行。

  • 请您看一下这个问题:http://stackoverflow.com/questions/29236308/how-to-print-arguments-in-svn-hook。 - Darko Rodic
    答案已经给出。SVN Hook 只会显示输出到 STDERR 而不是 STDOUT 的内容。并且,只有在 Hook 失败时(即退出时的返回值为非零值)才会发生这种情况。 - David W.
    好的,我在我的post-commit hook中有这个命令: $msg = $svnlook changed -t "$rev" "$repos"; 并且msg的长度为0,这意味着命令无法执行,在Windows上,所以这个命令是否正确,因为我没有在任何地方看到错误? - Darko Rodic
    2
    如果是提交后钩子,请使用-r而不是-t - David W.

    13

    在 pre-commit 中使用 svnlooksvnlook changed 显示提交的更改路径。将其与您的列表进行比较。如果找到/未找到路径,则拒绝提交。一个简单的 pre-commit 示例:

    #!/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。用户将看到你在那里输出的内容。


    在precommit hook中,(svn list repo_path)的相似命令是什么? - MokiNex
    1
    我会尝试使用 svnlook tree REPOS_PATH 命令来获取该路径下的所有内容。使用选项 -h 可以获得更多选项。 - swo
    你能帮我解决这个问题吗?https://stackoverflow.com/questions/54396777/how-to-list-a-specific-directories-in-the-svn-pre-commit-hook - MokiNex

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接