svn_merge

svn 的 merge其实很好用,当然前提是你明白了svn merge这个命令,还好,我用了大约一年明白了这个命令 -___-!!

跟大家说一下用法,比如我们要把分支merge到主干上

# svn merge --help
merge: Apply the differences between two sources to a working copy path.
usage: 1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
       2. merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
       3. merge [-c M | -r N:M] SOURCE[@REV] [WCPATH]

我们以第一个为例
merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
这个help里面提示,merge需要三个参数
sourceURL1,sourceURL2的含义并不是两个分支,或者一个分支一个主干,而是同一个分支的两个状态,或者说是两个版本。对这两个版本做一个diff,然后把diff的结果,应用到最后的参数WCPATH上,WCPATH代表是一个本地已经checkout的工作区

svn merge的思想是diff and apply

比如,我开发一个项目叫做proj
目录结构是
proj/trunk
proj/branches
proj/tags

(省略了http:// 之后的,只是相对路径,但是真正使用时候不能省略)

当版本达到100的时候,我决定做一个branch进行一些其他开发
 [Reversion:100]
 $svn cp proj/trunk proj/branches/proj_branch_1
 OK Reversion:101

然后,trunk和proj_branch_1都在开发,到了某一个版本,比如150,branch开发完成,需要merge回到trunk
此时的目录结构是
[Reversion:150]
proj/trunk
proj/branches/proj_branch_1
proj/tags

按照svn的实现,我需要知道proj_branch_1所做的所有的变化,也就是当前的状态对刚刚生成时候状态的变化。根据这个变化生成一个diff文件,在apply一个本地的工作区上。(建议是一个干净的本地trunk工作区)

那么执行
$cd proj/trunk
$svn merge proj/branches/proj_branch_1@101 proj/branches/proj_branch_1 .

其实,第一个URL(我们称之为左边),为起始状态,通过最后的@101,表示取版本101,这个101就是cp成功之后的那个版本。第二个URL(我们称之为右边),为最终状态,取最新的,
 左边和右边做了一个diff,应用到当前工作区目录,也就是trunk。
 此时
 $svn st就可以看到变化了

这里的一个问题是如何获取这个cp之后的版本,也就是例子中的101
可以使用svn log里面的--stop-on-copy命令
$svn log --stop-on-copy proj/branches/proj_branch_1
会到cp的时候停下来,那里边标注的版本就是需要的版本

 比如,这是一个真正项目的一个例子,
 ------------------------------------------------------------------------
 r995 | yinweiming | 2007-10-24 09:07:08 +0800 (三, 24 10月 2007) | 1 line

 Create a branch for proj client using
 ------------------------------------------------------------------------
 其中的r995,995就是我需要的版本
 (说明一下,commit时候写commet的好处,比如这里我就很明确的肯定这是branch的起始点)

对于svn merge的另外的用法也是类似,只要是明白了
他是根据左边,右边生成diff,然后应用到本地的一个工作区就容易理解了。

还有可以使用svn merge --dry-run来模拟假装merge一下,看一下merge会发生什么,而不是真正的做这个动作。


而对于merge的help里面的 3. merge [-c M | -r N:M] SOURCE[@REV] [WCPATH]
这个也很容易理解,就是取 SOURCE 这个东西,版本N,M之间的区别,作用在WCPATH这个本地工作区上

注意!
做branch千万别根据本地修改过的工作区做,一定基于某一个URL的版本做
我就吃过这个亏
diff的时候,diff不出来,因为基于本地工作区的,所以现在merge起来很是费劲
### SVN Merge 操作详解 在本地文件中使用 SVN 执行 `merge` 操作,可以按照以下方式实现。通过 SVN 的 `merge` 命令,用户可以在本地工作副本中将一个分支的更改合并到另一个分支或主干中。 #### 1. 使用 `svn merge` 进行版本范围合并 当需要将某个版本范围内的更改合并到当前工作目录时,可以使用以下命令: ```bash svn merge url -r xxxx:yyyy ./ ``` 此命令会将 `url` 所指向的路径从版本 `xxxx` 到版本 `yyyy` 的更改应用到当前目录下[^1]。 #### 2. 使用 `svn merge` 进行特定提交的合并 如果仅需合并某一个具体的提交(例如修订号为 `xxxx`),可以使用以下命令: ```bash svn merge url -c xxxx ./ ``` 这条命令的作用是将 `url` 所指向路径中修订号为 `xxxx` 的更改应用到当前目录下[^1]。 #### 3. 模拟合并操作以防止错误 为了避免实际执行合并时可能出现的问题,可以先使用 `--dry-run` 参数进行模拟运行: ```bash svn merge url -r xxxx:yyyy ./ --dry-run ``` 或者对于单个提交的合并: ```bash svn merge url -c xxxx ./ --dry-run ``` `--dry-run` 参数不会真正修改任何文件,而是显示合并操作将会产生的影响,从而帮助开发者提前发现潜在问题。 #### 4. 完成合并后提交更改 在完成 `merge` 操作后,需要检查解决可能存在的冲突,并使用以下命令提交合并结果: ```bash svn commit -m "Merge changes from revision xxxx to yyyy" ``` 确保在提交时添加适当的注释以记录合并的操作内容[^2]。 #### 5. 示例:从分支合并到主干 假设有一个分支位于 `http://svn.example.com/repo/branches/mybranch`,并且希望将其合并到主干 `http://svn.example.com/repo/trunk` 中,则可以在主干的工作目录下执行以下命令: ```bash svn merge http://svn.example.com/repo/branches/mybranch -r 100:200 ./ ``` 这会将分支中的修订号从 `100` 到 `200` 的更改合并到主干中[^3]。 #### 注意事项 - 在执行 `merge` 操作之前,确保工作目录是最新的,可以通过 `svn update` 命令更新本地副本。 - 合并完成后,务必检查是否有冲突文件并手动解决这些冲突。 - 解决冲突后,使用 `svn resolved` 命令标记冲突已解决,然后继续提交。 ```python # 示例代码块:Python 脚本用于自动化 SVN Merge 操作 import subprocess def svn_merge(url, start_rev, end_rev, dry_run=False): command = f"svn merge {url} -r {start_rev}:{end_rev} ./" if dry_run: command += " --dry-run" result = subprocess.run(command, shell=True, capture_output=True, text=True) return result.stdout output = svn_merge("http://svn.example.com/repo/branches/mybranch", 100, 200, dry_run=True) print(output) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值