【问题标题】:How to force a directory to stay in exact sync with subversion server如何强制目录与颠覆服务器保持精确同步
【发布时间】:2012-04-12 21:42:33
【问题描述】:

我有一个目录结构,其中包含一组应用程序的配置文件。该结构在 Subversion 中维护,然后一些系统检查了该目录结构。开发人员对存储库中的结构进行更改,服务器上的脚本只是定期运行“svn update”。

但是,有时我们会无意中删除其中一个目录下的 .svn 目录,或者将不属于的文件粘贴到其中。我尽我所能切断程序不忠者的手,但我仍然希望我的更新脚本能够优雅地(嗯,自动地)处理这些更改。

所以,我需要的是一种方法来删除不在颠覆中的文件,以及一种继续并踩踏本地目录的方法,该目录妨碍存储库中的某些内容。所以,像

这样的警告
Fetching external item into '/path/to/a/dir'
svn: warning: '/path/to/a/dir' is not a working copy

Fetching external item into '/path/to/another/dir'
svn: warning: Failed to add directory '/path/to/another/dir': an unversioned directory of the same name already exists

应该会自动解决。

我担心我必须在脚本中解析 svn 状态输出,或者使用 svn C API 并编写我自己的“清理”程序来完成这项工作(是的,它必须这样工作方式; rsync / tar + scp,以及由于各种原因而不能选择的其他任何东西)。但是,如果有人有解决该问题的解决方案(或部分解决方案),我将不胜感激。 :)

【问题讨论】:

    标签: perl svn


    【解决方案1】:

    怎么样

    rm -rf $project
    svn checkout svn+ssh://server/usr/local/svn/repos/$project
    

    【讨论】:

    • 我也用过svn update --accept theirs-full project,但它假定存在一个健全的.svn 目录,我不知道它是否会删除未跟踪的文件。
    • 虽然删除在技术上可行,但它缺乏一定的优雅。 :) 主要问题是在这种情况下需要一段时间才能再次检查目录(它包含大约 110K 文件)。我希望这个解决方案有足够的针对性,它只能修复损坏的部分,以免对存储库中损坏的部分的使用产生不利影响。
    • 实际上,它非常优雅,因为它可以在一行清晰的代码中处理损坏的.svn 目录。替代方案将是一团糟。怎么可能验证.svn 目录?
    • 这非常简单,但考虑一下如果有人称您为“优雅”,而如果有人称您为“简单”,您会有什么感觉。他们是不同的。 ;) 假设乔不小心从他的 homedir 中删除了三个文件。擦除驱动器并从备份中重建整个系统很简单。至于“如何验证 .svn 目录”,您可以在包含它的目录上运行 svn status。如果 .svn 目录损坏,svn status 会报错。 :)
    • 只有在status 抱怨时才运行rm
    【解决方案2】:

    我写了一个 perl 脚本,首先运行 svn cleanup 来处理任何锁,然后解析 svn status 的 --xml 输出,删除任何状态不好的东西(除了外部,它有点复杂)

    然后我发现了这个: http://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svn-clean 尽管这并不能满足我的所有需求,但我可能会丢弃大部分代码并稍微增强它。我的 XML 解析没有想象中那么漂亮,而且我确信这比启动系统命令要快一些(这对非常大的存储库和每五分钟运行一次的命令很重要)。

    我最终在这个问题的答案中找到了该脚本 - Automatically remove Subversion unversioned files - 隐藏在使用 Tortoise SVN 的所有建议中。

    【讨论】:

    • ...过了一会儿,我最终做的是直接使用 svn API(不是 pysvn)编写一个 python 脚本,以根据 post-commit 和 post 复制对文件系统的更改回购中的 -revprop-change 挂钩。现在我只是每 6 小时进行一次预定导出以处理未经授权的更改,但我正在编写一个文件系统监视器(通过 pyinotify 进行 inotify)来捕获对文件系统的任何非挂钩生成的更改。任何其他检测到的文件系统更改都会生成警报,并用来自 svn 的副本替换任何更改。详情最终在blog.dannysauer.com/?tag=subversion
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2017-01-04
    • 2016-05-26
    • 1970-01-01
    相关资源
    最近更新 更多