svn 从一个版本库中导出子目录 到另一台电脑资源库的同一个子目录下

A电脑的资源库目录下有 a1, a2 两个子目录, 在B电脑svn资源库中有 a2,a3 两个子目录, 两台电脑的a2子目录是相同, 我在A电脑修改了a2目录下的文件,
怎么把修改后的新版本导出来, 导入到B电脑的 a2目录中, 实现两台电脑的 两个子目录同步
补充下, 我这是宿舍的电脑和公司的电脑, 是两个不同svn资源库, 都是自己在用的, 不用考虑冲突问题

第1个回答  2012-08-03
你的A电脑的资源库、B电脑的资源库指的是两个不同的SVN服务器端,还是同一个SVN库下的两个客户端?

如果是指同一个SVN库的两个客户端,那么就很简单了,两个客户端各自做各自的提交、更新操作就是了,如果想实现B电脑客户端的自动同步,那只要在B电脑上设置一个定时任务,比如每小时自动执行一次svn update操作就是了

如果是只两个不同的SVN服务器端,这个就麻烦了。首先必须保证B电脑上的a2文件夹只能是从A电脑上传过去,而不能是由其他人上传修改,否则会导致经常冲突;然后,你在A电脑上将A、B服务器的两个库分别checkout出来,在A电脑的SVN服务器端hooks文件夹下设置一个钩子post-commit,这个钩子会在A电脑的服务器端每次执行commit操作后自动执行,在这个钩子里先update A服务器checkout出来的那个文件夹,然后将update后的内容(过滤掉.svn文件夹)复制到B服务器checkout出来的那个文件夹,然后add 、commit B服务器checkout出来的那个文件夹。

或者另外一个办法,使用svn:externals(外部引用)属性,在B服务器checkout出来的a2文件夹上设置这个属性,使得B服务器的a2文件夹指向A服务器的a2文件夹,每次update时就会自动从A服务器上取这个文件夹的内容出来。但同样,这时B服务器的这个文件夹是不能被人为修改的。追问

我这是宿舍和公司的两台电脑

追答

这两台电脑都是客户端,还是分别在两台电脑上安装了服务器端?

追问

当然是两个服务端的, 就是有两个资源库, 公司一个, 宿舍一个, 要同步两个资源库中的某个a目录

追答

1、如果从宿舍能访问公司的SVN服务器(比如VPN方式),那么使用svn:externals(外部引用)属性应该是最好的方法了。在宿舍的服务器检出的版本库中外部引用公司的SVN服务器的a2文件夹,而且可以读写操作。
2、如果从宿舍不能访问公司的SVN服务器:
(1)在移动硬盘上为宿舍的SVN服务器checkout出一个本地工作区。
(2)每天下班前,在公司SVN服务器checkout出来的a2文件夹上点右键,查看日志,选中昨天最后的那个版本以及今天修改过的所有版本,右键点击这些版本,选择“比较版本差异”,并在弹出窗口中选中所有已改变文件,右键点击这些文件,选择“导出选择项”,导出到移动硬盘上的a2文件夹。
(3)回到宿舍后提交移动硬盘上的a2文件夹。

追问

这样导出来是 有变化的文件的最新版本, 那日志信息呢, 提交后也只提交最新的版本, 那这样还不如整个文件夹直接复制回去提交,... 要求是: a电脑今天 提交了3个版本, 要同步到b电脑去 , 包括 新增加的3个版本, 和每个版本的日志信息

追答

如果要保留日志信息,那就必须能够联网才行了,你必须能够从宿舍访问公司的SVN服务器才有可能做到这个,用外部引用的方式。

当然,理论上你可以手动获取每次提交的内容和日志,然后每天回到宿舍按顺序模拟这个提交过程。但想想实在太繁琐了。

SVN自己没法做到这个,SVN的同步机制有svnsync,这个命令是用于从源版本库同步到目标版本库,这个同步是连日志一起导过去的,但是这两个版本库是完全相同的,不能只同步某个文件夹,而且目标版本库必须是不能被其他人修改的。如果你是要同步整个库而不是某个文件夹,而且目标库不需要改动的话,我就推荐用svnsync了,可以把宿舍的服务器端设定在移动硬盘上,每天在公司同步完带回宿舍。但你的需求不是这样,所以svnsync不可用。

追问

那就只能去掉日志信息, 只提交最新的了

第2个回答  2012-08-09
我猜应该一个是开发库 一个是运营库吧
1.更新A的a2和B的a2库
2.rsync 把A 的a2文件传到B a2目录 并删除B a2目录中A的a2没有的文件
3.对B中a2新添加的文件提交
4。删除所有svn状态为!的文件
5.提交更改
相似回答