使用SVN(或git)自动提交文件修改?

时间:2011-04-27 17:12:21

标签: svn git continuous-integration

我一直在阅读和寻找解决方案几天但没有找到任何适合我需要的解决方案。

我们经常更新设计人员和开发人员更新的网站,大部分时间都不会将更改提交给SVN。

我正在研究持续集成类型解决方案,当登台服务器上的“版本化”文件更新时,它会自动提交给SVN。

CruiseControl和我看过的其他工具不这样做;是否有一个工具可以实现这一目标或我们可以使用的更好的流程?

感谢您的帮助!

克里斯

5 个答案:

答案 0 :(得分:5)

我真的很喜欢你说“更好的过程”,因为答案是肯定的。

让你的设计师和每个人都来自回购。如果您选择SVN或git或其他东西并不重要,但要使其成为“权威”副本。这样做最终会让您头疼,因为您将拥有所有更改的清晰历史记录,并且始终可以恢复。

我为网页设计商店设置一些环境的方式是与你建议的系统相反,它的工作原理如下:

  • 所有设计师都会处理网站的签出副本,并根据需要进行更改和提交/更新。
  • 在提交时,存储库会将站点的副本推送到临时服务器,该服务器的配置几乎与生产相同。
  • 如果该网站正在进行暂存,则可以非常有信心它可以在实时服务器上运行。
  • 准备好后,可以将登台服务器上的网站副本复制到实时,现在您已经以非常负责任的方式更新了网站,并且您拥有所有更改的历史记录。 (为此我喜欢使用rsync,你可以让它工作,但你认为合适)

我希望这可以帮助你稍微考虑一下你的过程。

回到原来的问题:如果你真的不想改变你的过程,你可以设置一个每隔几分钟运行一次的cron,并添加/提交所有已经改变的文件,这应该有效。但我不喜欢这个,因为现在你没有有意义的提交消息,改变历史也可能没有意义。当人们正在工作并保存文件时,他们没有意识到他们在什么时候被提交,所以很可能现在存储库中存在破坏状态的修订,现在你如何找到未破坏的修订版本?选择“自动化”提交显然不是最干净的解决方案。

答案 1 :(得分:2)

我相信(虽然我没有尝试过)你可以为看门狗(http://packages.python.org/watchdog/)编写一个观察者来为你做提交。

但是,我同意ctcherry你会在破碎的状态下获得大量的豁免。你真的需要改变你的过程。

答案 2 :(得分:2)

  

CruiseControl和其他工具我   看着不要这样做

我愿意与众不同。如果您要配置一个<exec>块来调用SVN命令行工具来为您提交代码,那么这不是您要求的吗?您可以使用<filesystem>节点来确定修改了哪些文件。

现在,虽然你可以做到这一点,但我也同意@ctcherry的说法,如果你直接用这个来生产,可能会导致代码被破坏。

答案 3 :(得分:2)

听起来你想在Subversion中使用WebDAV进行自动转换。 Subversion and WebDAV

之前我使用过这种方法。很高兴你可以像windows / linux网络共享一样设置它。非技术人员只是将其视为存储文件的网络驱动器。每当用户在那里保存文档/文件时,它都会以静默方式提交。

Git可能有类似的东西,但我没有经验。

答案 4 :(得分:0)

在开发者网站上,你可以开发一个支持这个东西的工具,你可以看到下面的代码,下面的代码支持你如何在SVN上做自动提交,看一下:)

任何反馈或问题,请留下您的评论,我们可以讨论一下

请参阅此处的代码:

    public static string AppTitle = "Auto Commit";

    // AddFileToSVN
    public static bool AddFileToSVN(string strLogFile, string path, 
                                         Timer myTimer)
    {
        try
        {
            using (SharpSvn.SvnClient client = new SharpSvn.SvnClient())
            {
                Collection changeFiles = new 
                                Collection();
                client.GetStatus(path, out changeFiles);

                foreach (SharpSvn.SvnStatusEventArgs changeFile in 
                                                     changeFiles)
                {
                    if (changeFile.LocalContentStatus == 
                                       SharpSvn.SvnStatus.Missing)
                    {
                        client.Delete(changeFile.Path);
                        WriteLog(strLogFile, changeFile.Path + " Removed - 
                                 Missing files (that are not in filesystem)");

                        myTimer.Enabled = false;
                    }

                    if (changeFile.LocalContentStatus == 
                                     SharpSvn.SvnStatus.NotVersioned)
                    {
                        client.Add(changeFile.Path);
                        WriteLog(strLogFile, changeFile.Path + " Added - 
                                   This file is new in filesystem!");

                        myTimer.Enabled = false;
                    }
                }
                return true;
            }
        }
        catch (Exception ex)
        {
            myTimer.Enabled = true;
            WriteLog(strLogFile, ex);
            return false;
        }
    }

    // CommitToSVN
    public static bool CommitToSVN(string strLogFile, string workingcopy, 
                                          string message, Timer myTimer)
    {
        using (SharpSvn.SvnClient client = new SharpSvn.SvnClient())
        {
            SharpSvn.SvnCommitArgs args = new SharpSvn.SvnCommitArgs();

            args.LogMessage = message;
            args.ThrowOnError = true;
            args.ThrowOnCancel = true;

            try
            {
                myTimer.Enabled = true;
                return client.Commit(workingcopy, args);
            }
            catch (Exception ex)
            {
                myTimer.Enabled = true;
                WriteLog(strLogFile, ex);
                return false;
            }
        }
    }

查看更多信息:来自here