现在的位置: 首页SCM>正文
SVN实现在更新本地版本库时忽略指定目录
2012年02月17日 SCM 评论数 10 ⁄ 被围观 1,065+

很多时候,你的svn repo(假定project)很大(这里指包括所有tagsbranches),但是其实你真正需要的却只有一两个(比如说trunk,以及和trunk平级的install目录,同时install目录和trunk目录有着这样活那样的联系),这时你就希望在svn co的时候是co整个project并且忽略你不想要的目录。当然,你大可不必co整个project,而单独co你想要的目录就行了。但是,从SCM的角度出发,你不可以强行改变用户的使用习惯,不排除就有这么些人喜欢这样操作,尤其是对于那些喜欢用命令行的人而言。

可能我这么说,大家没有什么概念,我给大家举个例子,大家应该就知道这是一种什么情况了:

大家都知道,在一个项目的SCM管理中,往往要求开发者通过打tag的方式来进行版本发布,tag存在于tags目录,tags目录往往与trunk/branches目录平级,这里还有一个install目录,如下:

  1. project/   
  2. |-- branches   
  3. |   |-- branch1   
  4. |   |-- branch2   
  5. |   `-- branch3   
  6. |-- install   
  7. |-- tags   
  8. |   |-- tag1   
  9. |   |-- tag2   
  10. |   |-- tag3   
  11. |   |-- tag4   
  12. |   `-- tag5   
  13. `-- trunk   
  14.     `-- src  

tags目录虽然是一个标签副本,但在checkout的过程中,是会针对一份完整代码的,因此很多人都不希望在本地的working copy中保留这个tags目录。遗憾的是,svn co命令并没有这样一个选项去忽略这个目录。

事实上,我也遇到了这个问题,在我看了很多help之后,终于找到了一个办法。具体如下:

1. checkout真个project:

  1. # svn co http://svn_url/project  

如果项目较大,你可以随时终止,但你要保证本地已经将tags目录取下来了(哪怕是只取了其中的一个文件也行),换句话说就是,确保你要排除的那个目录(tags)已经在你working copyversion control下了。

2. 运行以下命令将tags以及branches目录排除在svn up列表:

  1. # svn update --set-depth=exclude tags branches
  2. D    tags
  3. D    branches 

选项后面可以跟多个目录,这样,就在你当前的working copy中成功的将tagsbranches目录排除掉了,在你下一次的update中,就不会去理会这两个目录了,但同时有保证了你的project是在version control下的,因此不需要每次都逐个进入目录进行svn up了。


目前有 10 条留言 其中:访客:6 条, 博主:4 条

  1. blackold CHINA Mozilla Firefox Windows : 2012年02月17日14:51:02  1楼 @回复 回复

    学习学习!

    很久不来了。 :smile:

  2. maggie CHINA Google Chrome Windows : 2012年02月17日17:20:01  2楼 @回复 回复

    好用

  3. maggie CHINA Google Chrome Windows : 2012年02月17日17:22:21  3楼 @回复 回复

    我也用svn啊,当然需要

    • Bob.B CHINA Google Chrome Windows : 2012年02月17日17:26:14 @回复 回复

      @maggie : 哦,我刚回忆了一下,我当时在的时候其实就有这种需求,只不过当时没有意识去想怎么弄……现在是不得不去弄……

  4. 希征十字军 CHINA Google Chrome Windows : 2012年02月21日10:33:42  4楼 @回复 回复

    bob,你可以用下面的方式试一下。
    svn checkout --depth empty http://svn_url/proj proj
    cd proj
    svn update --set-depth infinity proj/trunk

    • Bob.B CHINA Google Chrome Windows : 2012年02月21日13:49:31 @回复 回复

      @希征十字军 : 这样做的话,最终貌似还是不能将代码co出来,而仅仅是跳过了一个目录而已,至少我这里看起来没啥效果:

      1. [root@mail-test2 ~/temp/temp]$svn co --depth empty http://svn.xxx.com/repos/soft/aaa xxx   
      2. 取出版本 462969。   
      3. [root@mail-test2 ~/temp/temp]$cd xxx/   
      4. [root@mail-test2 ~/temp/temp/xxx]$ls  
      5. [root@mail-test2 ~/temp/temp/xxx]$svn up  --set-depth infinity aaa/bbb   
      6. 跳过“aaa/bbb”   
      7. [root@mail-test2 ~/temp/temp/xxx]$svn up   
      8. 版本 462969。  
    • 希征十字军 CHINA Google Chrome Windows : 2012年02月21日14:19:40 @回复 回复

      第三个步骤需要改成 svn update --set-depth infinity trunk

      • Bob.B CHINA Google Chrome Windows : 2012年02月21日14:24:31 @回复 回复

        @希征十字军 : 貌似还是不行,其实即使可行的话,依然需要连续update好几个目录,这样就没法满足某些人想一次性敲完命令回家的需求……
        anyway,非常感谢哈……以后有问题找你请教,哈哈…… :mrgreen:

  5. AKMFCJ CHINA Google Chrome Windows : 2012年04月11日20:55:37  5楼 @回复 回复

    只是不取出tag目录,但速度好像没有提升多少

不留下点什么? 吹个牛也行的^_^

留言无头像?

留言字数需小于500字,已输入字数:


/ 快捷键:Ctrl+Enter

×
腾讯微博