Subversion 1.6.0和目录树冲突

Filed Under (General, Subversion Client) by rocksun on 31-03-2009

Tagged Under : ,

大多数Subversion用户熟悉文本的冲突,一个经典场景是你在工作拷贝修改了一个文件,而svn update从版本库带来的变更也包含了这个文件的修改,而这两部分变更无法干净的结合为一个本地变更,结果就是文本冲突。Subversion 1.6.0将此概念扩展倒了目录级别,例如,你在本地删除了一个文件,而更新会带来这个文件的文本变更时的情况,这种新的冲突被叫做目录树冲突。

让我们看一个预期中目录树冲突的简单例子,不过首先看一下在Subversion 1.5.6的老“方式”。

和文本冲突一样,目录树冲突会在更新、转移或合并(从技术上讲,检出时也会)时发生,在这个例子中,我们从trunk合并到trunk的一个分支上。

1.5.6

 在我们的工作拷贝,我们有一个有文本修改的文件:

1.5.6> svn st
M notes\obliterate\obliterate-functional-spec.txt

检查一下从trunk需要合并那些内容,我们得到了r36680:

1.5.6> svn mergeinfo --show-revs eligible %URL%/trunk .
r36680

查看r36680的日志,我们看到Barry恰好将我们本地修改的文件改名:

1.5.6> svn log -v -r36680 %URL%
------------------------------------------------------------------------
r36680 | Barry | 2009-03-19 11:21:25 -0400 (Thu, 19 Mar 2009) | 1 line
Changed paths:
A /trunk/notes/obliterate/obliterate-func-spec.txt (from
/trunk/notes/obliterate/obliterate-functional-spec.txt:36679)
D /trunk/notes/obliterate/obliterate-functional-spec.txt
Just making a file name a bit shorter
------------------------------------------------------------------------

想到Subversion将重命名作为复制和删除的组合执行,当我们合并r36680时,重命名的添加部分会成功,但是删除部分则由于删除本地的修改而不能成功,Subversion通常会通知不能删除未版本化的修改:

 

1.5.6> svn merge %URL%/trunk . -c36680
--- Merging r36680 into '.':
A notes\obliterate\obliterate-func-spec.txt
Skipped 'notes\obliterate\obliterate-functional-spec.txt'

当合并之后,留下了两个版本化的spec文件,Barry重命名的一部分以及我们的本地修改。我们可以以此提交,但是这不是我们希望的。在这个情况下获得正确的结果,也就是在改名的文件中包含我们的修改,因为Subversion使用复制和删除对待改名的情况,实现这个目标需要多出许多环节。

首先,我们需要使用OS的复制命令复制修改的文件到新位置:

1.5.6> copy notes\obliterate\obliterate-functional-spec.txt notes\obliterate\obliterate-func-spec.txt
Overwrite notes\obliterate\obliterate-func-spec.txt? (Yes/No/All): y
 1 file(s) copied.

然后使用Subversion来恢复到 我们最初本地修改的文件:

1.5.6> svn revert notes\obliterate\obliterate-functional-spec.txt
Reverted 'notes\obliterate\obliterate-functional-spec.txt'

现在允许我们删除它:

作为选择,你可以只使用–force选项删除和组合最初的两步。诚然,这是一个坏习惯,这样会清除掉所有的本地修改。回想我们说Subversion会努力保留未版本化的本地修改,svn delete –force就是与revert子命令不同的一个例子,所以要小心。

1.5.6> svn del notes\obliterate\obliterate-functional-spec.txt
D notes\obliterate\obliterate-functional-spec.txt

留下我们希望得到的东西,注意’notes\obliterate\obliterate-func-spec.txt’包含了我们最初的本地修改。

1.5.6> svn st
 M .
D notes\obliterate\obliterate-functional-spec.txt
A + notes\obliterate\obliterate-func-spec.txt

现在,在上面的例子中,很明显发生了什么。但是如果我们合并了几百个修订和几百个改变的路径?很容易错过这种“Skipped”的信息,提交合并。这些错误会在很久以后才能被发现。

1.6.0

现在,让我们看一下1.6.0中的目录树冲突,给定同样的分支工作拷贝:

1.6.0> svn st
M notes\obliterate\obliterate-functional-spec.txt

我们执行相同的合并,注意最显著的改变,我们看到目录树冲突,而不是跳过:

1.6.0> svn merge %URL%/trunk . -c36680
--- Merging r36680 into '.':
A notes\obliterate\obliterate-func-spec.txt
C notes\obliterate\obliterate-functional-spec.txt
Summary of conflicts:
 Tree conflicts: 1

检查工作拷贝的状态,我们看到与1.5.6的第二项区别。重命名的额外部分会和以前一样,但是会在’notes\obliterate\obliterate-functional-spec.txt’ (第7列的‘C’)报告目录树冲突。此外,有一些目录树冲突的本性,特别是合并时包含本地的修改和来自的删除。

 

1.6.0> svn st
 M .
M C notes\obliterate\obliterate-functional-spec.txt
A + notes\obliterate\obliterate-func-spec.txt

让我们假定无视目录树冲突,直接提交。这是第三个变化,Subversion不会允许包含目录树冲突的工作拷贝提交:

1.6.0> svn ci -m "I don't care what happened! Commit away" .
svn: Commit failed (details follow):
svn: Aborting commit: 'C:\SVN\1.6.0.WC\my_branch_WC\notes\obliterate\obliterate-functional-spec.txt' remains in conflict

为了提交这个合并,我们需要说出我们的决定。如果因为一些原因我们希望保留两个文件,我们可以直接解决冲突并提交变更。也有可能我们希望将变更应用到新文件,在这时我们可以解决这个冲突:

1.6.0> svn resolve --accept working -R .
Resolved conflicted state of 'notes\obliterate\obliterate-functional-spec.txt'
1.6.0> svn st
 M .
M notes\obliterate\obliterate-functional-spec.txt
A + notes\obliterate\obliterate-func-spec.txt

下面的步骤和1.5.6时一样。

注意:在1.6.0,–accept选项的svn resolve子命令对于目录树冲突没有特殊处理。只要有目录树冲突,结果相同,就像你使用废弃的svn resolved命令。只有以前的文本冲突在对–accept选项有效。

应该注意到目录树冲突的概念并不新鲜。你可以在Subversion 1.6之前的任何版本遇到目录树冲突,1.5.6的例子是一个“目录树冲突”,只是它并没有有用的方式处理。 1.6.0的目录树冲突特性主要关于识别出目录树冲突,并在没有解决时将其保持在工作拷贝。

对于每个新特性,以后的发布都会有许多要做的事情。在这里,让命令行程序更简单的解决目录树冲突就非常重要。如果你是Collabnet Desktop的用户,你很幸运。在桌面版的1.8版本,预计在2009年3月,会包含目录树冲突解决特性。这个特性会完成冲突解决的许多脏活。前面的例子中,可以轻松的将修改从 ’obliterate-functional-spec.txt’ 合并到’obliterate-func-spec.txt’,只需要一个对话框。如果你对1.6的目录树冲突感兴趣,而没有使用Collabnet Desktop,可能是一个尝试的好机会。

  

Paul Burba is a developer in CollabNet’s Version Control team. In that role he works on OSS Subversion where he is a full-committer. When not in front of his computer he’s probably on a bike somewhere.

稀疏目录支持排他选择了

Filed Under (Subversion Client) by rocksun on 05-03-2009

Tagged Under : , ,

在Subversion 1.5中,引入的稀疏目录的支持(还有合并跟踪远程版本库合并)已经融入我的日常工作中。因为我的日常工作包括许多不同软件的不同部分,在同一时刻,我会跟踪多个软件的不同开发分支,如果我不用稀疏目录,我的项目目录会这个样子:

$ ls ~/projects
subversion/		      svnbook/		 viewvc-1.0.7/
subversion-1.5.x/	      thotkeeper/	 viewvc-1.0.x/
subversion-1.6.x/	      thotkeeper-0.3.0/  viewvc-1.1.0-beta1/
subversion-http-protocol-v2/  viewvc/		 viewvc-1.1.x/
$

从正面讲,我可以通过运行svn update ~/projects/*快速更新所有的工作拷贝。

但是对于我这样十分依赖命令行自动完成的人来说,这样许多的类似目录前缀让我的自动完成环境毫无意义,不使用类似的前缀呢?那样更原始。

幸运的是,稀疏目录给我一个完整的工作拷贝组织的新角度,现在,许多项目目录只包含了项目,就像这些:

$ ls ~/projects
subversion/  svnbook/  thotkeeper/  viewvc/
$

那些目录的根目录都是稀疏检出的,下面是(至少)“trunk”目录,也可能是“branches”的一些子目录,甚至可能是“tags”下的特定目录,~/projects/*仍然可以工作,我的工作拷贝托普结构匹配这种模式。

我这里就不具体说稀疏检出的细节—我已经在《使用Subversion进行版本控制》中(http://www.subversion.org.cn/svnbook/nightly/svn.advanced.sparsedirs.html)介绍,后面我们将说一下Subversion 1.6对这个特性的改进。

在Subversion 1.6(将会发布),svn update的–set-depth参数有了一个新的值— exclude。这个值告诉Subversion从工作拷贝立刻排除目标,之后也保持效果。在Subversion 1.5,如果分支对我没有意义,我可以简单的删除掉它。如果只是删除,在下次更新时就会回来。如果我svn delete它,分支会永远保持本地的修改。(当然,除非我提交,带来了更大的麻烦,愤怒的同伴,叉子和火炬。那样很混乱 — 你一定不希望这样。)Subversion 1.6中新的排除机制正是为此而来。

假设我不关心我项目工作拷贝中的某些目录,例如我不会在乎Subversion中的网站目录,通过排除特性,我可以告诉Subversion移除目录:

$ cd ~/projects/subversion/trunk
$ svn update --set-depth=exclude www
D         www
$ ls www
ls: cannot access www: No such file or directory
$

完成。当我以后更新我的工作拷贝时,我不会收到www目录的变更,如果我后来需要这个目录,我可以重新“订阅”它:

$ svn update --set-depth=infinity www
A    www
A    www/links.html
A    www/testing-goals.html
…
A    www/tigris-permissions.html
A    www/webdav-usage.html
Updated to revision 36292.
$

注意,如果你排除了一个版本化的目录,而其中包含未版本化文件,或者有本地修改的文件,Subversion会优雅的处理这种情况,删除这些文件是不安全的,Subversion只会保留和对应文件相关的文件和目录。

我希望这些改进也能帮助你们,你怎么想?怎样用稀疏目录更好的组织你的生活?

英文原文地址:http://blogs.open.collab.net/svn/2009/03/sparse-directories-now-with-exclusion.html

Subversion结合Apache与LDAP

Filed Under (Subversion Server) by rocksun on 03-03-2009

Tagged Under : , ,

因为Apache 2.2改进了认证和授权模块的管理模式,所以有必要写一篇新的文章来介绍这种不同。

配置

对于只想达到目标的朋友,只需要复制粘贴下面的代码:

Read the rest of this entry »