在我的工作场所,每次有人尝试将 10-20 个项目中的任何一个的文件 checkin SVN 存储库时,都会在 Unix 计算机上运行一个 Perl 脚本。
它的工作方式是,每个项目都有自己的“Hooks”文件夹,其中包含一个名为“pre-commit”的文件,当有人 checkin 某些内容时,SVN 会自动执行该文件。除了“预提交”文件实际上是一个符号链接(symbolic link),指向所有项目通用的一个中央 Perl 脚本,这样如果需要对 Perl 脚本进行更改,则不需要对每个项目进行更改。
所以我的问题是这样的:我需要在每个项目的“hooks”目录中放置一个文本文件,每个文件都包含一些特定于该项目的设置。因此,将有 10-20 个设置文件(每个项目一个),每个文件位于各自的“hooks”目录中。
问题是我需要在 Perl 脚本中打开这些文本文件并从中读取,但我在让 Perl 知道在哪里找到它时遇到问题。我尝试使用 $0 参数,该参数应该告诉我脚本从哪里执行,但因为它是一个符号链接(symbolic link),所以它只是说“不是目录”并且脚本终止。我需要获取“hooks”目录的路径,以便找到文本文件。
最佳答案
SVN 预提交脚本应该使用存储库的路径作为其第一个参数来调用。在 Perl 脚本中,该参数应以 $ARGV[0]
形式提供。您应该能够通过简单地附加到存储库路径来构建相应的 hooks 目录或该目录内的文件的路径,如下所示:
$repopath = $ARGV[0];
$hookspath = $repopath . "/hooks";
$myfilepath = $hookspath . "/myfile";
尽管为了获得最大的可移植性,使用 File::Spec 模块中的路径名操作函数来执行此操作会更清晰。
如果这种方法不起作用,那么您必须详细解释如何调用 Perl 脚本。例如,如果您的预提交脚本实际上是一个最终调用 perl
的 shell 脚本包装器,那么它可能没有正确传递预提交参数。
向我们展示您当前失败的代码也是一件好事。
关于linux - Perl 中的 SVN 预提交符号链接(symbolic link)路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10952732/