查找未添加到 subversion 的文件
Posted
技术标签:
【中文标题】查找未添加到 subversion 的文件【英文标题】:Find files not added to subversion 【发布时间】:2011-04-25 00:42:34 【问题描述】:以下问题变得越来越普遍:
有几个开发人员正在开发一个包含新文件(通常是图像)的项目 每个人都说一切都已签入,我们冻结了开发。我们不知道,有些图像没有签入。用户没有注意到丢失的文件,因为它们是新的,而不是签出,所以 svn 看起来很好 代码已编译和部署(抱歉,没有 QA 团队) 第二天客户告诉我们丢失的图像 CTO 向我们宣读了暴动法案注意:图像路径既存在于代码中,也存在于数据库中,因此获取所有使用过的图像的完整列表并不容易。
我的希望是写一个C#小程序供大家在部署前运行。我想找出项目目录中的哪些文件(或其中一个是 subdir.s,递归地)尚未添加到 subversion。理想情况下,我还想排除主动添加到忽略列表中的项目。
我们在 Windows 主机和客户端上使用 TortoiseSVN。
如何以编程方式发现未添加的文件?
到目前为止我能找到的最接近的东西是 this 说要使用 svn status | grep -e ^?
但这看起来像一个 Unix 命令。
【问题讨论】:
不是答案,但是当我通过 Tortoise 提交时,我总是选中“显示未版本控制的文件”框。这显示了目录中尚未添加的每个文件,并提醒我将它们签入。您想要忽略的东西(.suo、.user、ReSharper 文件等)可以忽略一次,它将防止这使差异数据变得丑陋,只留下真正的未签入文件。 对我来说这听起来像是一个人的问题。 “每个人都说一切都签入”是不够的,下一个破坏构建的人应该支付 10 美元(团队的存钱罐)。创建一个工具来检查另一个工具是否正确使用听起来非常错误。 无论我们多么努力,我们至少有时会破坏构建。 (如此努力以至于我们从不破坏它是浪费时间)。这是个好问题,因为根据我的经验,#1 签入错误是缺少新文件。 @JoeEnos 在我们的例子中,'“显示未版本控制的文件”框已选中'从未显示未添加的新文件。我们使用带有 UI 的“TortoiseSVN 1.8.0,Build 24401 - 64 Bit,2013/06/17 18:15:59 Subversion 1.8.0,-release on windows7” @ShirishHerwade 自从我使用 SVN 已经有一段时间了,但我不希望这种行为会改变。我最好的猜测是那些丢失的文件已经在你的忽略列表中。 【参考方案1】:svn status | grep -e ^?
这是 unix 命令,但我很确定,如果你从 Tortoise 执行提交,你可以看到带有问号的新文件,即不受 svn 控制的文件
【讨论】:
在 Tortoise 中搜索带问号的文件并不是解决问题的程序化解决方案。 无论如何都觉得这很有帮助!【参考方案2】:您可以为此使用SharpSvn,并编写如下内容:
SvnClient client = GetClient();
client.Status(workingCopyPath, (o, e) =>
if(e.LocalContentStatus == SvnStatus.NotVersioned)
Console.WriteLine("Not versioned: " + e.FullPath);
);
编辑:这也将尊重您的忽略文件和svn:ignore
属性。
【讨论】:
感谢您的提示。这个库看起来可能正是我需要的。由于它严重缺乏文档或示例,我不知道如何使用它,但我会继续使用它。【参考方案3】:您可以安装CollabNet Subversion Command-Line Client,然后将其svn
命令作为子进程运行,将其输入通过管道传输到您的程序中,然后搜索以?
作为第一个字符的行(表示未知/未检入Subversion并且没有被忽略)。您可以将 CollabNet 的命令行客户端与 TortoiseSVN 一起使用。
这与svn status | grep -e ^?
所做的相同,但它不依赖于 Unix 工具。
或者,您可以只安装 Cygwin 并拥有全系列的 Unix 工具供您使用。
【讨论】:
【参考方案4】:代码编译部署 (抱歉,没有 QA 团队)
这不是真正的问题吗?如果您将未经测试的代码发送给客户,那么第一个发现任何问题的人当然是客户。也许(除了解决这个特定问题之外)您需要做的是在您的构建过程中添加至少一些基本的自动(或手动)功能测试,有时在代码编译和移交给客户端之间。
【讨论】:
我当然不能在这里和你争论,但我在这件事上的权力非常有限。 您的开发人员在没有测试时会受到影响。测试让你不再害怕接触任何东西。【参考方案5】:这个问题被标记为tortoisesvn
,所以我假设您的团队正在使用 TortoiseSVN 作为客户端。正如@Joe Enos 建议的那样,TortoiseSVN 显示与svn:ignore
中的条目不匹配的未版本控制文件。我想知道添加另一个工具是否会有所帮助,因为团队应该已经在使用 TortoiseSVN 检查未版本化的文件。
否则,C# 程序在 SVN 工作目录中查找未版本控制的文件似乎是多余的。正如@Josh Kelley 建议的那样,您可以只使用命令行SVN 客户端(例如CollabNet 或Slik SVN)和grep
。
您还可以使用 Windows 命令行中的findstr
命令:
svn status | findstr "^?"
【讨论】:
findstr 技巧非常棒!多亏了你,我现在有了一个批处理文件,它可以告诉我在某些修订之间添加或删除的每个文件。svn diff -r REVNO:HEAD --summarize | findstr "^A" > AddedFiles.txt
svn diff -r REVNO:HEAD --summarize | findstr "^D" > DeletedFiles.txt
只需将 REVNO 和 HEAD 更改为您喜欢的任何范围。也感谢这个页面:muffinresearch.co.uk/archives/2008/09/15/…
我运行了这个命令没有显示 svn status | findstr "^?"【参考方案6】:
您还可以更改一项设置,该设置将显示包含已修改的新添加文件的文件夹。
设置->图标叠加层->显示未版本化项目的叠加层
右键单击文件夹,然后导航 TortoiseSVN - 设置。单击“图标叠加层”。在右侧检查 - '未版本化的文件将父文件夹标记为已修改'
这适用于 windows7,未在其他操作系统上尝试过
【讨论】:
以上是关于查找未添加到 subversion 的文件的主要内容,如果未能解决你的问题,请参考以下文章
Centos 编译安装Apache subversion-1.9.7 + httpd 2.4.32
使用IDEA subversion插件从SVN服务器上check out 代码