我想知道如何在 pre-commit 钩子中获取正在提交的文件列表。
如果该列表不包含特定路径下的特定文件,则我希望拒绝该次提交。
我想知道如何在 pre-commit 钩子中获取正在提交的文件列表。
如果该列表不包含特定路径下的特定文件,则我希望拒绝该次提交。
svnlook
命令应该被钩子脚本使用而不是svn
。如果这是一个预提交钩子,你需要使用提交的事务号;如果这是一个后提交钩子,则需要使用修订版本号。svnlook -h
可以查看所有子命令。以下是其中一些:author
- 检索提交者的用户IDcat
- 打印指定文件changed
- 打印更改的文件和目录date
- 打印提交的时间戳diff
- 打印所有文件的差异dirs-changed
- 打印更改的目录filesize
- 以字节打印文件大小history
- 打印历史记录(类似于svn log
)info
- 打印文件信息lock
- 打印锁定信息propget
- 获取特定属性proplist
- 列出所有属性tree
- 打印目录结构uuid
- 打印仓库的UUIDyoungest
- 打印最后一个修订版本号看起来svnlook changed
是你想要的。
关于svnlook
有两个非常重要的事情:
svnlook
命令而不是svn
。svnlook
命令不能更改任何数据,只能显示数据。有人想知道如何使用svnlook
更改属性值。答案是你不能。svnlook
以仓库目录位置为参数,而不是仓库的URL。这意味着svnlook
只能在服务器上运行。在 pre-commit 中使用 svnlook
。 svnlook 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
。用户将看到你在那里输出的内容。
svnlook tree REPOS_PATH
命令来获取该路径下的所有内容。使用选项 -h
可以获得更多选项。 - swo
STDERR
而不是STDOUT
的内容。并且,只有在 Hook 失败时(即退出时的返回值为非零值)才会发生这种情况。 - David W.$svnlook changed -t "$rev" "$repos"
; 并且msg的长度为0,这意味着命令无法执行,在Windows上,所以这个命令是否正确,因为我没有在任何地方看到错误? - Darko Rodic-r
而不是-t
。 - David W.