标题听起来可能很奇怪,但我正在尝试实现以下目标:
SVN repo 位置:/home/flx/svn/flxdev SVN repo“flxdev”结构:
+ Project1
++ files
+ Project2
+ Project3
+ Project4
我正在尝试设置一个提交后挂钩,当我提交时它会自动在另一端签出。
提交后文档明确列出了以下内容:
# POST-COMMIT HOOK
#
# The post-commit hook is invoked after a commit. Subversion runs
# this hook by invoking a program (script, executable, binary, etc.)
# named 'post-commit' (for which this file is a template) with the
# following ordered arguments:
#
# [1] REPOS-PATH (the path to this repository)
# [2] REV (the number of the revision just committed)
因此我制作了以下命令来测试:
REPOS="$1"
REV="$2"
echo "Updated project $REPOS to $REV"
但是,当我在 Project1 中编辑文件时,输出“已将项目 /home/flx/svn/flxdev 更新至 1016”
我希望这是:“已将项目 Project1 更新至 1016”
有了这个变量,我可以指定每个项目提交后执行不同的操作。我该如何指定项目参数?
谢谢!
丹尼斯
答案1
以下可能会做你想做的事情:
#!/bin/bash
REPOS="$1"
REV="$2"
echo In revision $REV, the following projects were changed:
svnlook dirs-changed "$REPOS" --revision "$REV" \
| sed 's%/.*%%' \
| sort -u \
| while read PROJ ; do
echo "$PROJ"
done
如果你不太熟悉 shell 脚本,下面解释一下正在发生的事情:
- 我们用来
svnlook
获取已更改的目录列表 - 我们用来
sed
删去第一个“/
”以及其后的所有内容——这样我们就得到了一个项目名称列表,其中可能包含重复项。 - 我们使用
sort -u
(“唯一排序”)来消除重复项 - 我们将每个名称逐一读入 $PROJ 并对其进行处理。
您可以echo "$PROJ"
用项目名称的任何内容替换此行。如果在同一提交中更改了多个项目,则您在此处输入的任何内容都将针对每个更改的项目运行一次,并适当设置 $PROJ。
此脚本不会显示文件是否已添加到存储库的根目录中,但如果添加了目录,则它们将显示在已修改的项目列表中。如果您希望根目录也列出,则可以替换以下 sed 行,它将显示为“/”。如果您这样做,请小心,不要意外签出整个存储库!
...
| sed '/^\/$/!s%/.*%%' \
...