星期一, 五月 11, 2009

uuid of subversion

uuid of subversion

在做 subversion 迁移的时候,使用了 svnsync 来同步 repository 数据(编写的 svnsync.sh 脚本调用 svnadmin 和 svnsync init/sync 过程并日志),服务端的迁移没有什么问题,而客户端的重定位,直接使用 sw 不行:

  [root@vxy8_cfengine2 /tmp/cfengine.svn]
#svn sw http://172.22.35.10/svn/trunk/KS_CFENGINE/cfengine
svn: 'http://172.22.35.10/svn/trunk/KS_CFENGINE/cfengine'
is not the same repository as
'http://172.22.35.12/svn'

这就是说,直接使用 sw 需要在同一个主机的同一个 repository 下才行。

但 sw 有一个 --relocate 参数,可以切换 repository:

  [root@vxy8_cfengine2 /tmp/cfengine.svn]
#svn sw --relocate http://172.22.35.12/svn/trunk/KS_CFENGINE/cfengine http://172.22.35.10/svn/trunk/KS_CFENGINE/cfengine
svn: The repository at 'http://172.22.35.10/svn' has uuid '0ce980e2-6b68-4f57-841b-e7c3a84044d9', but the WC has '92f65df4-df84-11dc-ae99-89d8fa8a2030'

这个报错和 subversion 的 uuid 有关,这是由 svnsync 同步数据遗留的问题,源 repos 和新 repos 的 uuid 不一致,看看工作目录的情况:

  [root@vxy8_cfengine2 /tmp/cfengine.svn]
#svn info
Path: .
URL: http://172.22.35.12/svn/trunk/KS_CFENGINE/cfengine
Repository Root: http://172.22.35.12/svn
Repository UUID: 0ce980e2-6b68-4f57-841b-e7c3a84044d9
Revision: 2837
Node Kind: directory
Schedule: normal
Last Changed Author: roczhou.zhoup
Last Changed Rev: 2835
Last Changed Date: 2009-05-11 10:50:24 +0800 (Mon, 11 May 2009)

使用 svnlook uuid 可以查看 repos 的 uuid。下面是源 repos

  [root@vxy8_cfengine2 /tmp/cfengine.svn]
#svnlook uuid /home/admin/data/svn_repo/
0ce980e2-6b68-4f57-841b-e7c3a84044d9

下面是目标 repos

  [root@vxy7_cfengine1 /var/cfengine.svn]
#svnlook uuid /home/admin/data/svn_repo
92f65df4-df84-11dc-ae99-89d8fa8a2030

解决办法是,对于 subversion-1.5 以上,可直接在运行 svnadmin setuuid 来设置源或目标 repos 的 uuid 使其保持一致,对低于 subversion-1.5 的系统,示例如下(更改源 repos):

  [root@vxy8_cfengine2 /tmp/cfengine.svn]
#vi /tmp/x

SVN-fs-dump-format-version: 2

UUID: 92f65df4-df84-11dc-ae99-89d8fa8a2030

[root@vxy8_cfengine2 /tmp/cfengine.svn]
#cat /tmp/x | svnadmin load --force-uuid /home/admin/data/svn_repo/

#svnlook uuid /home/admin/data/svn_repo/
92f65df4-df84-11dc-ae99-89d8fa8a2030

[root@vxy8_cfengine2 /tmp/cfengine.svn]
#svn info
Path: .
URL: http://172.22.35.12/svn/trunk/KS_CFENGINE/cfengine
Repository Root: http://172.22.35.12/svn
Repository UUID: 0ce980e2-6b68-4f57-841b-e7c3a84044d9
Revision: 2837
Node Kind: directory
Schedule: normal
Last Changed Author: roczhou.zhoup
Last Changed Rev: 2835
Last Changed Date: 2009-05-11 10:50:24 +0800 (Mon, 11 May 2009)

# 此时还没变

[root@vxy8_cfengine2 /tmp/cfengine.svn]
#svn sw --relocate http://172.22.35.12/svn/trunk/KS_CFENGINE/cfengine http://172.22.35.10/svn/trunk/KS_CFENGINE/cfengine
svn: The repository at 'http://172.22.35.10/svn' has uuid '51c9629f-21a9-4eaa-825b-20ccd5c61100', but the WC has '92f65df4-df84-11dc-ae99-89d8fa8a2030'

[root@vxy8_cfengine2 /tmp/cfengine.svn]
#svn up

[root@vxy8_cfengine2 /tmp/cfengine.svn]
#svn info
Path: .
URL: http://172.22.35.12/svn/trunk/KS_CFENGINE/cfengine
Repository Root: http://172.22.35.12/svn
Repository UUID: 92f65df4-df84-11dc-ae99-89d8fa8a2030
Revision: 2837
Node Kind: directory
Schedule: normal
Last Changed Author: roczhou.zhoup
Last Changed Rev: 2835
Last Changed Date: 2009-05-11 10:50:24 +0800 (Mon, 11 May 2009)

# 此时已经改变

[root@vxy8_cfengine2 /tmp/cfengine.svn]
#svn sw --relocate http://172.22.35.12/svn/trunk/KS_CFENGINE/cfengine http://172.22.35.10/svn/trunk/KS_CFENGINE/cfengine
svn: The repository at 'http://172.22.35.10/svn' has uuid '51c9629f-21a9-4eaa-825b-20ccd5c61100', but the WC has '92f65df4-df84-11dc-ae99-89d8fa8a2030'

但运行还是出错,这说明,更改源 repos 的 uuid 无效!

那么尝试更改目标的 uuid(下面让 vxy8_cfengine2 作为目标,vxy7_cfengine1 作为源)

  [root@vxy8_cfengine2 /tmp/cfengine.svn]
#!286
cat /tmp/y | svnadmin load --force-uuid /home/admin/data/svn_repo/

[root@vxy8_cfengine2 /tmp/cfengine.svn]
#svnlook uuid /home/admin/data/svn_repo/
0ce980e2-6b68-4f57-841b-e7c3a84044d9

[root@vxy7_cfengine1 /tmp/cfengine.svn]
#svn info
Path: .
URL: http://172.22.35.10/svn/trunk/KS_CFENGINE/cfengine
Repository Root: http://172.22.35.10/svn
Repository UUID: 92f65df4-df84-11dc-ae99-89d8fa8a2030
Revision: 2842
Node Kind: directory
Schedule: normal
Last Changed Author: roczhou.zhoup
Last Changed Rev: 2842
Last Changed Date: 2009-05-11 14:52:36 +0800 (Mon, 11 May 2009)

[root@vxy7_cfengine1 /tmp/cfengine.svn]
#svn sw --relocate http://172.22.35.10/svn/trunk/KS_CFENGINE/cfengine http://172.22.35.12/svn/trunk/KS_CFENGINE/cfengine
svn: The repository at 'http://172.22.35.12/svn' has uuid '92f65df4-df84-11dc-ae99-89d8fa8a2030', but the WC has '0ce980e2-6b68-4f57-841b-e7c3a84044d9'

[root@vxy8_cfengine2 /tmp/cfengine.svn]
#cat /tmp/x | svnadmin load --force-uuid /home/admin/data/svn_repo/

[root@vxy8_cfengine2 /tmp/cfengine.svn]
#svnlook uuid /home/admin/data/svn_repo/
92f65df4-df84-11dc-ae99-89d8fa8a2030

[root@vxy7_cfengine1 /tmp/cfengine.svn]
#svn sw --relocate http://172.22.35.10/svn/trunk/KS_CFENGINE/cfengine http://172.22.35.12/svn/trunk/KS_CFENGINE/cfengine

[root@vxy7_cfengine1 /tmp/cfengine.svn]
#svn info
Path: .
URL: http://172.22.35.12/svn/trunk/KS_CFENGINE/cfengine
Repository Root: http://172.22.35.12/svn
Repository UUID: 92f65df4-df84-11dc-ae99-89d8fa8a2030
Revision: 2848
Node Kind: directory
Schedule: normal
Last Changed Author: roczhou.zhoup
Last Changed Rev: 2847
Last Changed Date: 2009-05-11 16:15:01 +0800 (Mon, 11 May 2009)

这里已经完成了切换。所以,要统一 uuid,需要更改目标 repos 的 uuid。

另外,从上面的例子可以看出,修改了 repos 的 uuid 之后,对于已经检查(checkout/co)的工作目录不会有影响,当其下一次 svn up 之后,其 info 中的 uuid 即进行了更新。