如何在提交期间忽略特定的Subversion子目录

时间:2009-02-25 21:42:30

标签: svn

在我正在进行的当前项目中,有人决定将二进制文件作为源树的一部分进行检查。二进制文件位于源本身下方的目录中:

project/src             # Here is the location of the source code
project/src/more_src    # Some more source code lives here
project/src/bin         # Here are the binary files

可以想象,合并冲突因此而一直发生。这很烦人,因为我觉得任何开发人员的机器都不应该提交二进制文件 - 这应该留给构建服务器。

我是subversion的命令行用户。我想忽略bin目录,以便在使用svn stsvn ci时跳过这些目录(即使有待更改)。

不幸的是,由于more_src目录,我无法使用-N(非递归)。

我该如何做到这一点?

5 个答案:

答案 0 :(得分:15)

编辑:subversion 1.6已经发布。从发行说明:

  

在Subversion 1.6中, - set-depth   svn update的参数已经增长了   新的价值 - 排除。这个值告诉我   Subversion从中排除目标   工作副本,立即和   直至另行通告。之前   Subversion 1.6,如果目录可以   不容易从工作中删除   复制。 ...

以下所有内容现已过时。


您可以在正确的位置限制工作副本中文件夹的深度,以便不需要的文件不会显示为版本化文件。 虽然您无法减少现有工作副本的深度。

1)签出这样一个干净的工作副本(它只包含根目录中的文件和空文件夹):

  

svn co --depth immediates repoURL   /一些/ WC /路径

2)现在,对于您不想忽略的每个文件夹,请使用

提取内容
svn update --depth infinity /some/good/path

如果包含要忽略的内容的文件夹不在工作副本的根目录中,您可以通过反复调用

逐步向下工作。
svn update --depth immediates /some/path/to/make/deeper

这种方法确实有缺点。如果要忽略的文件通过您自己的操作(例如构建)出现在您的工作副本中,它们将以svn状态显示为未版本控制的文件。您甚至可以添加它们并导致“文件已存在”提交错误。

<小时/> 编辑:显然,您可以减少工作副本的部分深度,这更简单:

  1. 正常项目结帐(或开始 来自现有的工作副本)
  2. 删除不需要的文件夹(正常 filesystem delete,而不是svn rm)。此时文件夹缺少,如果您进行了正常更新,则会返回所有内容。
  3. 带回
  4. 文件夹
      

    svn update --depth为空   /路径/其中/删除/文件夹/是

    现在你可以对整个项目进行svn更新,但不会返回坏内容。

答案 1 :(得分:2)

我会创建一个脚本或别名,通过一个命令直接使用子目录。

我有类似的情况,并有一组像这样的别名:

alias up-all='svn up ~/includes ~/scripts ~/htdocs/intra ~/htdocs/update'

如果你在Windows上,你可以拼凑一些.bat或其他脚本并将它们放在你的路径中以获得相同的结果。

答案 2 :(得分:2)

通常,您只想保留已明确发布的二进制文件,即测试部门使用的正式版本或二进制文件。因此,提交每个新构建的二进制文件确实没有意义。

因此,您的问题的真正解决方案是重新设计SVN存储库。构建文件的目录不应受源代码控制,应使用svn:ignore属性进行忽略。这可以防止新建的二进制文件被SVN注意到。其次,您可以创建一个单独的目录来存储您想要保留的二进制文件。该目录当然需要受版本控制。

现在你可以开发,而不会有更改二进制文件的麻烦。当你最终到达你想要保留这些二进制文件的阶段时,你只需将这些二进制文件复制到上面创建的单独目录中,从而覆盖旧的二进制文件。 SVN现在会注意到文件已经更改,您可以提交它们。

我过去看到的另一种方法是首先从源树创建一个TAG。然后,构建服务器(或您自己)检出此TAG并从已检出的TAG构建二进制文件。之后,构建的二进制文件将在该TAG之上提交。许多人认为你永远不应该在TAG之上做出承诺,但它可能适合你。您应该记住的唯一想法是,当您导出/签出该TAG时,您必须采用HEAD修订而不是TAG自己的修订(这将是HEAD-1)。

答案 3 :(得分:1)

如果他们受版本控制,那么颠覆正在做它的工作:)

wcoenen的方法也应该在完成一些工作后完成工作,另一种方法可能是执行svn revert / project / src / bin然后svn ci的脚本。

为了它的价值,这就是我们设置“deploy”目录的一个原因,并且总是忽略bin和obj目录输出。这种方式只有在某些版本构建时才会将二进制输出复制(并添加到svn)进行部署。

答案 4 :(得分:1)

要添加到上面的另一个重要注释(从http://svnbook.red-bean.com/nightly/en/svn.advanced.props.special.ignore.html复制):

Subversion对可忽略文件模式的支持将扩展到将未版本控制的文件和目录添加到版本控制的一次性过程。一旦对象受Subversion的控制,忽略模式机制不再适用。换句话说,不要指望Subversion避免提交您对版本化文件所做的更改,因为该文件的名称与忽略模式匹配 - Subversion始终会注意到其所有版本化对象。