说明:
原来的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 ./