【问题标题】:Svn status output to remote server by ftp?svn状态通过ftp输出到远程服务器?
【发布时间】:2014-03-29 23:21:56
【问题描述】:

这是问题定义; 我的工作副本中有一些本地更改。我可以通过 svn st 命令列出它们。示例输出;

M       admin/controller/common/forgotten.php
M       admin/controller/sale/contact.php
A  +    admin/model/tool/mail.php
D       catalog/view/theme/default/template/mail/order.tpl
D       catalog/view/theme/default/template/mail/recommend.tpl
A  +    mail_template

我有一个远程服务器,我想通过 ftp 将这些更改推送到远程服务器进行测试。如果没问题,我会把它们提交到主干。

现在我通过在 ftp 客户端中一一选择并查找和上传这些文件来做到这一点。但有时它非常耗时,尤其是当更改的文件更多时。

所以我希望这个动作由脚本或工具自动完成。有什么建议吗?或者我应该为这个问题写一个小应用程序?

【问题讨论】:

    标签: svn ftp


    【解决方案1】:

    这里有一些用 写的东西可以工作。如果您不喜欢 perl,它至少可以让您了解在自己的脚本中应该做什么。我试着把它写成可读的。

    用这个调用svn status | perl scriptname.pl启动脚本。

    脚本逐行读取 svn status 的输出。它检查这些行是否描述了添加、修改/替换或删除的元素,并将元素的路径添加到相应的列表中。然后它会尝试连接到 FTP 服务器并更改那里的元素。

    FTP 部分完全未经测试。

    当你添加一个包含子元素的文件夹时,我还没有测试过 SVN 会做什么。也许您必须自己将所有子元素添加到@filesAdded

        #!/usr/bin/perl
    
        use Net::FTP;
    
        use strict;
        use warnings;
    
        my $username = "username";
        my $password = "password";
        my $host = "example.com";
        my $port = 20;
        my $path = "/some/path/";
    
        my @filesAdded;
        my @filesModified;
        my @filesDeleted;
    
        while(<STDIN>) {
            chomp;
            if (/[A]...... (.+)/) {
                push @filesAdded, $1;
            } elsif(/[MR]...... (.+)/) {
                push @filesModified, $1;
            } elsif (/[D]...... (.+)/) {
                push @filesDeleted, $1;
            }
        }
    
        print "========================[ CHANGES ]========================\n";
        print "filesAdded[".(scalar @filesModified)."]=".(join ", ", @filesModified)."\n";
        print "filesModified[".(scalar @filesModified)."]=".(join ", ", @filesModified)."\n";
        print "filesDeleted[".(scalar @filesDeleted)."]=".(join ", ", @filesDeleted)."\n";
        print "==========================[ FTP ]==========================\n";
    
        {
            my $ftp = Net::FTP->new(Host => $host, Port => $port) or die "Cannot connect to $host: $@";
            $ftp->login($username, $password) or die "Cannot login ", $ftp->message;
            $ftp->cwd($path) or die "Cannot change working directory ", $ftp->message;
    
            for my $fileAdded (@filesAdded) {
                if(-f $fileAdded) {
                    $ftp->put($fileAdded);
                } elsif(-d $fileAdded) {
                    $ftp->mkdir($fileAdded, 1);
                }
            }
    
            for my $fileModified (@filesModified) {
                $ftp->put($fileModified, $fileModified);
            }
    
            for my $fileDeleted (@filesDeleted) {
                if(-f $fileDeleted) {
                    $ftp->delete($fileDeleted);
                } elsif(-d $fileDeleted) {
                    $ftp->rmdir($fileDeleted, 1);
                }
            }
            $ftp->quit;
        }
    
        print "========================[ SUCCESS ]========================\n";
    

    【讨论】:

    • 你能解释一下为什么发布提交钩子吗?因为要求是只有在远程服务器上测试完所有内容后才能在 svn 中提交本地更改。
    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多