重新指定svn库地址

说明:
原来的svn地址为:svn://1.1.1.1/coolnull/haiwai,checkout到/home/www/dota/www下,后面需要更新/home/www/dota/www目录的svn地址到:svn://1.1.1.1/coolnull/tw
其实这2个svn地址都一样,只是为了把tw跟haiwai的代码区别开来,特别另外建了个svn地址。

上网搜了下,发现这个命令svn switch –relocate 旧svn地址 新svn地址,
如svn switch –relocate svn://1.1.1.1/coolnull/haiwai svn://1.1.1.1/coolnull/tw
但这条命令发现只能实现更新svn://1.1.1.1/这ip,如1.1.1.1改成2.2.2.2,而不能更新工作目录即不能把haiwai改成tw。

后来试了下,其实可以通过删除/home/www/dota/www这个目录下所有.svn目录(.svn包含了所有svn信息);然后强制checkout svn://1.1.1.1/coolnull/tw到/home/www/dota/www目录下;然后再通过–accept=’theirs-full’,这样svn up时就不会出现更新冲突了。

具体:
1. 删除/home/www/dota/www目录下所有.svn目录,.svn包含了所有svn信息

# cd /home/www/dota/
# cp -r www www.bak.201501281249
# cd www www.bak.201501281249  //操作之前先拷贝一份,然后在拷贝上操作
# find ./ -name ".svn" -exec ls -d {} \;
./.svn
./Public/images/.svn
./Public/.svn
./Public/static/js/.svn
./Public/static/css/.svn
./Public/static/css/img/.svn
./Public/static/.svn
# find ./ -name ".svn" -exec rm -rf {} \;
# find ./ -name ".svn" -exec ls -d {} \;    //删除之后再ls已经看不到.svn信息了
#

 
2. 强制checkoutcheckout svn://1.1.1.1/coolnull/tw到/home/www/dota/www.bak.201501281249目录下

# cd /home/www/dota/www.bak.201501281249
# svn checkout --force svn://1.1.1.1/coolnull/tw ./
# find ./ -name ".svn" -exec ls -d {} \;   //再查看已经有.svn信息了
./.svn
./Public/images/.svn
./Public/.svn
./Public/static/js/.svn
./Public/static/css/.svn
./Public/static/css/img/.svn
./Public/static/.svn
#
# svn info  //可以看到svn的URL已经修改成svn://1.1.1.1/coolnull/tw了
Path: .
URL: svn://1.1.1.1/coolnull/tw 
Repository Root: svn://1.1.1.1/coolnull/
Repository UUID: 2c61789c-d705-0510-9b13-cf5f2486f85f
Revision: 2422
Node Kind: directory
Schedule: normal
Last Changed Author: root
Last Changed Rev: 2420
Last Changed Date: 2015-01-28 15:10:08 +0800 (Wed, 28 Jan 2015)

 
3. 通过–accept=’theirs-full’使/home/www/dota/www.bak.201501281249接受冲突的部分以服务器端修改为准。

# svn up  //可以看到冲突
Conflict discovered in 'test.txt'. 
Select: (p) postpone, (df) diff-full, (e) edit, 
        (mc) mine-conflict, (tc) theirs-conflict, 
        (s) show all options: 
# svn up --accept='theirs-full' *   //--accept='theirs-full'中的theirs-full是指以svn服务器上的文件为准,这样后面svn up更新就不会出现冲突了。

 
附录:
以上方法只是针对svn://1.1.1.1/coolnull/haiwai,svn://1.1.1.1/coolnull/tw这2个svn库文件完全相同的情况下。之所以会分成2个svn库,其实是程序那边要求的。下面的,讲的不是很清楚,后面再更新一下!
设想这样一种情况,svn://1.1.1.1/coolnull/haiwai,svn://1.1.1.1/coolnull/tw这2个svn库原本一致,原本svn://1.1.1.1/coolnull/haiwai是checkout到/home/www/dota/www目录下的,现在需要/home/www/dota/www使用svn://1.1.1.1/coolnull/tw这个svn库。正常按照上面的方法操作就可以了。

但如果在将svn://1.1.1.1/coolnull/tw强制checkout到/home/www/dota/www前,svn://1.1.1.1/coolnull/tw这个svn库下的某个文件已经被更改了,如a.html,即svn://1.1.1.1/coolnull/haiwai,svn://1.1.1.1/coolnull/tw这2个svn库都相同,除了a.html以外都一致。

这时,再将svn://1.1.1.1/coolnull/tw强制checkout到/home/www/dota/www后,svn up更新所有的文件都是正常的,除了a.html。因为svn会以为a.html已经是最新的,根本不会去更新a.html这个文件。这时就需要我们手动删除a.html,然后重新从svn://1.1.1.1/coolnull/tw update a.html这个文件下来。如果两个库修改的文件比较多的话,可以通过svn stat来确认有哪些文件已经修改了,将M开头的删除掉,重新svn up下就可以了
方法一:将所有svn文件删除后,重新svn up

# cd /home/www/dota/www
# svn list -R .|xargs rm -f  //这种方法傻点,是将所有文件svn都删除后,再重新update下来
# find ./ -name ".svn" -exec ls -d {} \; 
# svn up ./

 
方法二:找出2个库中差异的文件,删除后,重新svn up

# cd /home/www/dota/www
# svn stat  //通过svn stat获取两个库的差异文件,将差异文件删除再重新svn up
?       test.html
M       a.html
# rm -f a.thml  //带?的是没加入版本控制的文件,应该是后面生成的,所以不用删除。只删除M开头的
# svn up ./

发表评论

邮箱地址不会被公开。 必填项已用*标注