通过SVN进行离线同步的方法
背景
由于出差现场与公司网络不通,两地开发无法通过同一个SVN服务器进行管理。进行代码同步比较困难。进行代码合并往往费时费力,需要找到一个更好的方法提升效率。
对比
之前的方案
方式: 改动方直接通过SVN导出差异的文件,或者是记住改动过的文件,只复制改动过的文件。SVN导出的方式的缺点是没有SVN服务器的一方在导出时没法导出增量部分,而复制的方式是只适合少量修改的情况,否则容易出现遗漏。
然后,接收方收到改动的代码文件后的合并方案通常是提交本地代码到SVN,然后将收到的文件覆盖本地文件再次提交,通过SVN的版本记录来对比,再逐个文件查看,对比差异合并代码,或者是直接通过Android Studio或是Merge等工具进行文件合并。
缺点: 这种方式进行代码合并,不仅仅对于改动文件需要逐个查看合并,还需要对双方改动代码都了解。而且还非常容易出现遗漏、覆盖的问题。不仅劳心劳力还容易出错。对于删除文件也不能同步。
SVN同步方案
方式: 改动方直接提交到SVN,然后导出SVN增量版本,并将增量包发给对方。然后接收方将增量包导入到SVN仓库中,再从SVN中更新代码,合并后再提交。
优点: 双方都可以只发增量部分,不会随着迭代次数加大而增加合并难度。通过SVN的合并,不需要查看处理所有改动文件,只需要处理有冲突的文件就可以了,这一步可以减少大量的工作量。同时,还可以同步删除的文件。
缺点: 双方提交代码到SVN之前需要确认SVN仓库处于同步状态(即双方的SVN记录是完全一致的)。也就是说只有一方允许提交代码,另一方要提交代码必须等到从对方那拿到增量版本同步了仓库之后才能提交。否则会造成两个仓库无法同步。
具体操作
-
首先,双方都安装VisualSVN。安装时要安装命令行工具。
-
A导出仓库。在Repositories下的工程仓库Project上右键,然后选择Backup Repository,然后在弹窗上根据提示选择文件夹与文件名并导出仓库。
-
B导入仓库。在Repositories上右键,然后选择Restore Repository,然后在弹窗上根据提示选择从A处获取到的仓库备份文件并导入仓库。
-
B切入仓库路径。在工作目录上右键-->TortoiseSVN-->重新定位(Reload)-->在弹窗中输入刚刚还原的仓库的路径-->然后确认
经过前面4个步骤,在两端搭建了两个完全一致的两个仓库,并且两方各自的工作目录指向了各自的仓库,到此同步环境就搭建好了
-
A提交代码。目前SVN仓库是同步状态,A或者B都可以提交代码。但是A提交后B就不能提交了。但是A可以进行多次提交。
-
A导出增量版本。导出命令格式是
svnadmin dump REPOS_PATH [-r LOWER[:UPPER] [--incremental]]
示例:
svnadmin dump "D:\Repositories\project" -r 1:2 --incremental > "D:\project.bak"
-
B加载增量版本。导入的命令格式是
svnadmin load REPOS_PATH
示例:
svnadmin load "D:\Repositories\project" < "D:\project.bak"
-
B更新代码,处理冲突,完成代码合并。
注意: A与B同时只能一方提交,另一方需要在同步后才能提交。所以每次需要提前确认好。