svn diff

来源:互联网 发布:c语言基础编程题 编辑:程序博客网 时间:2024/05/16 06:09

解决SVN冲突攻略
zccst翻译

This tutorial is walkthough on how to resolve a conflict in svn (subversion)
这个手册是解决svn冲突的攻略

First I will make a test.txt
首先,我创建了一个名为test.txt的文件(在svn服务器端),并录入如下内容

test

Now I will commit the changes
现在我们提交刚刚添加的内容

C:\workspace\test>svn ci -m "making a starting point"
Sending        .
Sending        test.txt
Transmitting file data .
Committed revision 2.

Suppose we have 2 users. User1 and User2. Both of them will get and update from svn
假设我们有用户1和用户2两个人通过svn客户端获取svn服务器端的文件test.txt

C:\workspace\test>svn up
A    test.txt
At revision 2.

Now User1 will change the file to:
现在用户1更改文件test.txt内容为如下

User1 is making a conflict test

He then commits his changes
然后用户1提交刚才的更改

C:\workspace\test>svn ci -m "User1 starting a conflict"
Sending        .
Sending        test.txt
Transmitting file data .
Committed revision 3.

User2 now comes along and changes his local copy of the file not knowing that it has already been updated by User1 on the server.
用户2也对文件test.txt做了更改,此时他并不知道用户1做了更改并已提交。

test User2 making a conflict

When he tries to commit he will get and error from svn.
当用户2修改文件test.txt完毕后,准备提交时出错。

svn: Commit failed (details follow):
svn: File or directory 'test.txt' is out of date; try updating
svn: resource out of date; try updating

So User2 performs an update
根据错误提示,用户2更新了文件test.txt(此时发生了冲突)

C:\workspace\test>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 detects that theres a conflict here and require you to take some kind of action.


If you type ‘s’ here you will get a list of the commands and meaning
如果你输入s选项,则会列出所有svn解决冲突的选项,如下所示:

(e)  edit             - change merged file in an editor               #直接进入编辑
(df) diff-full        - show all changes made to merged file          #显示更改至目标文件的所有变化
(r)  resolved         - accept merged version of file

(dc) display-conflict - show all conflicts (ignoring merged version)  #显示所有冲突
(mc) mine-conflict    - accept my version for all conflicts (same)    #冲突以本地为准
(tc) theirs-conflict  - accept their version for all conflicts (same) #冲突以服务器为准

(mf) mine-full        - accept my version of entire file (even non-conflicts)#完全以本地为准
(tf) theirs-full      - accept their version of entire file (same)    #完全以服务器为准

(p)  postpone         - mark the conflict to be resolved later        #标记冲突,稍后解决
(l)  launch           - launch external tool to resolve conflict
(s)  show all         - show this list


【选择处理方式一:df】

If you type ‘df’ it will show you a all the conflicts in the following format
选择选项df,则会按如下格式显示所有冲突

Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options: df
--- .svn/text-base/test.txt.svn-base    Tue Aug 10 10:59:38 2010
+++ .svn/tmp/test.txt.2.tmp     Tue Aug 10 11:33:24 2010
@@ -1 +1,3 @@
-test
\ No newline at end of file
+<<<<<<< .mine +test User2 making conflict======= +User1 is making a conflict test>>>>>>> .r3
‘e’ option will open the conflicted file in the text editor that you configured for svn to use. In this case it will show

<<<<<<< .mine test User2 making conflict======= User1 is making a conflict test>>>>>>> .r3


You can resolve the conflict here by changing the text to what you desire.
For example:
你可以解决冲突通过改变文件内容,例如vim test.txt

User1 is making a conflict test User2 making conflict

save your changes and exit your text editor and it will give you the conflict options again. Now if you use the ‘r’ it will mark the file is merged with a ‘G’.  A status of ‘G’ means there was a conflict and it has been resolved.
保存更改,又出现刚才的选项。此时你使用r选项,则会合并文件。如下所示:

Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options: e
Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options: r
G    test.txt
Updated to revision 3.

you can now check the status with svn status. You see that test.txt is marked as ‘M’ all thats left to do is commit.
检查svn状态,你会发现文件test.txt前面已变成M

C:\workspace\test2>svn st
M       test.txt

C:\workspace\test2>svn ci -m "conflict resolved"
Sending        test.txt
Transmitting file data .
Committed revision 4.


【选择处理方式二:p】

Sometimes the conflicts are a bit more extensive and it requires more time or better tools to resolve the conflict in these cases you can chose ‘p’ to postpone the resolution.
有时,冲突会复杂一些,可能需要借助其他工具才能解决,这时你可以使用选项p

Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options: p
C    test.txt
Updated to revision 3.
Summary of conflicts:
  Text conflicts: 1

Now if you look in your directory you will see that svn has created a few extra files for you.
此时,查看当前文件夹下,出现了如下几个文件

08/10/2010  11:44 AM                94 test.txt
08/10/2010  11:44 AM                26 test.txt.mine
08/10/2010  11:44 AM                27 test.txt.r2
08/10/2010  11:44 AM                31 test.txt.r3

The test.txt file is now a file with both User2 and User1′s changes but marked.
文件test.txt包含了用户1和用户2的更改。

<<<<<<< .mine test User2 making conflict======= User1 am making a conflict test>>>>>>> .r3

test.txt.mine is User2′s copy.
文件.txt.mine保存了用户2的内容

test User2 making conflict

test.txt.r2 is the original base copy
文件.txt.r2是未冲突前的内容

test

test.txt.r3 is the copy User1 commited
文件.txt.r3保存了用户1的内容

User1 is making a conflict test

At this point you can choose your favorite merge tools to merge the differences in a file.
这种情况下,你可以选择自己喜欢的对比工具,查看差别。

I suggest merging the differences into test.txt and the do a
我建议和并不同至文件test.txt中,如果如下命令:

C:\workspace\test>svn resolve --accept working test.txt

Resolved conflicted state of 'test.txt'

You can also use any of the other files if you wanted to and just pass resolve –accept a different argument. Here are the valid arguments
当然,你也可以使用其他文件,使用resolve -accept 加其他参数,共6个

(1)#svn resolve –accept base
Choose the file that was the BASE revision before you updated your working copy. That is, the file that you checked out before you made your latest edits.
使用1.txt.r2作为最后提交的版本

(2)#svn resolve –accept working
Assuming that you've manually handled the conflict resolution, choose the version of the file as it currently stands in your working copy.
使用当前拷贝即test.txt作为最后提交的版本

(3)#svn resolve –accept mine-full
Resolve all conflicted files with copies of the files as they stood immediately before you ran svn update.
使用test.txt.mine作为最后提交的版本

(4)#svn resolve –accept theirs-full
Resolve all conflicted files with copies of the files that were fetched from the server when you ran svn update.
使用test.txt.r3作为最后提交的版本

(5)#svn resolve –accept mine-conflict
冲突的部分以本地修改为准

(6)#svn resolve –accept theirs-conflict
冲突的部分以服务器端修改为准

执行一下:svn resolved test.txt。


Now you are ready to commit.
然后提交

C:\workspace\test>svn ci -m "conflict resolved"
Sending        test.txt
Transmitting file data .
Committed revision 4.

查看修改的文件记录

svn cat -- 显示特定版本的某文件内容。

svn list -- 显示一个目录或某一版本存在的文件列表。

svn log -- 显示svn 的版本log,含作者、日期、路径等。

svn diff -- 显示特定修改的行级详细信息。

list示例:

svn list http://svn.test.com/svn     #查看目录中的文件。svn list -v http://svn.test.com/svn  #查看详细的目录的信息(修订人,版本号,文件大小等)。svn list [-v]                        #查看当前当前工作拷贝的版本库URL。

cat示例:

svn cat -r 4 test.c     #查看版本4中的文件test.c的内容,不进行比较。

diff示例:

复制代码
svn diff               #什么都不加,会坚持本地代码和缓存在本地.svn目录下的信息的不同;信息太多,没啥用处。svn diff -r 3          #比较你的本地代码和版本号为3的所有文件的不同。svn diff -r 3 text.c   #比较你的本地代码和版本号为3的text.c文件的不同。svn diff -r 5:6        #比较版本5和版本6之间所有文件的不同。svn diff -r 5:6 text.c #比较版本5和版本6之间的text.c文件的变化。svn diff -c 6 test.c    #比较版本5和版本6之间的text.c文件的变化。
复制代码

log示例:

复制代码
svn log         #什么都不加会显示所有版本commit的日志信息:版本、作者、日期、comment。svn log -r 4:20 #只看版本4到版本20的日志信息,顺序显示。svn log -r 20:5 #显示版本20到4之间的日志信息,逆序显示。svn log test.c  #查看文件test.c的日志修改信息。svn log -r 8 -v #显示版本8的详细修改日志,包括修改的所有文件列表信息。svn log -r 8 -v -q   #显示版本8的详细提交日志,不包括comment。svn log -v -r 88:866 #显示从版本88到版本866之间,当前代码目录下所有变更的详细信息 。svn log -v dir  #查看目录的日志修改信息,需要加v。svn log http://foo.com/svn/trunk/code/  #显示代码目录的日志信息。
复制代码

常用命令

svn add file|dir -- 添加文件或整个目录

svn checkout -- 获取svn代码

svn commit  -- 提交本地修改代码

svn status    -- 查看本地修改代码情况:修改的或本地独有的文件详细信息

svn merge   -- 合并svn和本地代码

svn revert   -- 撤销本地修改代码

svn resolve -- 合并冲突代码

svn help [command] -- 查看svn帮助,或特定命令帮助

svn diff个性化定制

svn配置文件: ~/.subversion/config

修改~/.subversion/config,找到如下配置行:

# diff-cmd = diff_program (diff, gdiff, etc.)

将上面那个脚本的路径添加进去就行,修改为

diff-cmd = /usr/local/bin/diffwrap.sh  #绝对路径

这样svn diff命令就会默认使用vimdiff比较文件。

diffwrap.sh文件

复制代码
#! /bin/bash# for svn diff: 修改~/.subversion/config,找到如下配置行:# diff-cmd = diff_program (diff, gdiff, etc.)# diff-cmd = ~/bin/diffwrap.sh# 参数大于5时,去掉前5个参数;参数小于5,失败,什么也不做shift 5# 使用vimdiff比较vimdiff "$@"
复制代码

svn diff

 
1、svn diff old_label1 new_label2

Index表示改变的文件名,---表示老版本,+++表示新版本,@@(老版本)起始行,行数 (新版本)起始行,行数 @@

紧接着的一块就是详细的改动情况,-表示老版本上的,+表示新版本

实例:svn diff old_label1 new_label2的显示结果

Index: liubin/products/ras/rig/reg_state.c

===================================================================

--- /nas/reg/reg_state.c      (.../old_Label1)      (版本966

+++ /nas/reg/reg_state.c      (.../new_Label2)       (版本1573

 

@@ -352,11 +352,7 @@

 07/09/09   abhi   Writing EPLMN list and RPLMN Act to NV if phone status change is received with

                    oprt mode LPM                     

 ==============================================================================*/

-

+

 /*==============================================================================


SVN的子命令SVN diff功能介绍

2010-05-24 14:16 佚名 字号:T | T
一键收藏,随时查看,分享好友!

本文向大家介绍一下SVN的子命令SVN diff,它的主要用法师比较两条路径的区别,在这里和大家分享一下,希望大家共同学习。

AD:51CTO学院:IT精品课程在线看!

本节和大家讨论一下版本控制工具SVN的子命令SVN diff使用情况,包括子命令SVN diff概念的基本介绍,以及关于子命令SVN diff的一个实例介绍,下面我们就为大家一一讲解。

名称
svn diff — 比较两条路径的区别。

概要
diff [-c M | -r N[:M]] [TARGET[@REV]...]
diff [-r N[:M]] --old=OLD-TGT[@OLDREV] [--new=NEW-TGT[@NEWREV]] [PATH...]
diff OLD-URL[@OLDREV] NEW-URL[@NEWREV]

描述
显示两条路径的区别,子命令SVN diff有三种使用方式:
运行svn diff以标准差别格式查看本地工作拷贝修改的内容。
显示TARGET在REV的样子时两个修订版本之间所作的修改,TARGET可以是任何工作拷贝路径或任何URL,如果TARGET是工作拷贝路径,则N缺省是BASE,而M是工作拷贝;如果是URL,则必须指定N,而M缺省是HEAD。“-c M”选项与“-r N:M”等价,其中N = M-1。使用“-c -M”则相反:“-r M:N”的意思是N = M-1。
显示在OLDREV的OLD-TGT和NEWREV的NEW-TGT之间的区别。如果提供PATH,则与OLD-TGT和NEW-TGT关联,将输出限制在那些路径。OLD-TGT和NEW-TGT可能是工作拷贝路经或URL[@REV]。如果没有指定,NEW-TGT缺省是OLD-TGT。“-r N”设置OLDREV缺省为N,而-r N:M设置OLDREV缺省为N,而NEWREV缺省为M。

svn diff --old=OLD-URL[@OLDREV] --new=NEW-URL[@NEWREV]的简写方式。
svn diff -r N:M URL是svn diff -r N:M --old=URL --new=URL的简写。
svn diff [-r N[:M]] URL1[@N] URL2[@M]是 svn diff [-r N[:M]] --old=URL1 --new=URL2的简写。
TARGET是一个URL,然后可以使用前面提到的--revision或“@”符号来指定N和M。
如果TARGET是工作拷贝路径,则--revision选项的含义是:
--revision N:M 
服务器比较 TARGET@N和TARGET@M。
--revision N 
客户端比较TARGET@N和工作拷贝。
(无--revision)
客户端比较base和 TARGET的TARGET。
如果使用其他语法,服务器会比较URL1和URL2各自的N和M。如果省掉N或M,会假定为HEAD。
缺省情况下,svn diff忽略文件的祖先,只会比较两个文件的内容。如果你使用--notice-ancestry,比较修订版本(也就是,当你运行svn diff比较两个内容相同,但祖先历史不同的对象会看到所有的内容被删除又再次添加)时就会考虑路径的祖先。这是子命令SVN diff的描述。

选项
--revision (-r) ARG
--change (-c) ARG
--old ARG
--new ARG
--non-recursive (-N)
--diff-cmd CMD
--extensions (-x) "ARGS"
--no-diff-deleted
--notice-ancestry
--summarize
--force
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR

例子:
我们来看一下SVN子命令SVN diff的一个实例:比较BASE和你的工作拷贝(svn diff最经常的用法):
$ svn diff COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS (revision 4404)
+++ COMMITTERS (working copy)
查看文件COMMITTERS在修订版本9115修改的内容:
$ svn diff -c 9115 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS (revision 3900)
+++ COMMITTERS (working copy)
察看你的工作拷贝对旧的修订版本的修改:
$ svn diff -r 3900 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS (revision 3900)
+++ COMMITTERS (working copy)
使用“@”语法与修订版本3000和35000比较:
$ svn diff http://svn.collab.net/repos/svn/trunk/COMMITTERS@3000 http://svn.collab.net/repos/svn/trunk/COMMITTERS@3500
Index: COMMITTERS
===================================================================
--- COMMITTERS (revision 3000)
+++ COMMITTERS (revision 3500)…
使用范围符号来比较修订版本3000和3500(在这种情况下只能传递一个URL):
$ svn diff -r 3000:3500 http://svn.collab.net/repos/svn/trunk/COMMITTERS
Index: COMMITTERS
===================================================================
--- COMMITTERS (revision 3000)
+++ COMMITTERS (revision 3500)
使用范围符号比较修订版本3000和3500trunk中的所有文件:
$ svn diff -r 3000:3500 http://svn.collab.net/repos/svn/trunk          
使用范围符号比较修订版本3000和3500trunk中的三个文件:
$ svn diff -r 3000:3500 --old http://svn.collab.net/repos/svn/trunk COMMITTERS README HACKING          
如果你有工作拷贝,你不必输入这么长的URL:
$ svn diff -r 3000:3500 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS (revision 3000)
+++ COMMITTERS (revision 3500)
使用--diff-cmdCMD-x来指定外部区别程序
$ svn diff --diff-cmd /usr/bin/diff -x "-i -b" COMMITTERS 
Index: COMMITTERS
===================================================================
0a1,2
> This is a test。子命令SVN diff讲解在这里就告一段落了,请关注本节的其他相关报道。

SVN子命令diff三大用法详解
时间:2012-03-21  作者:模具联盟网  点击: 6676   评论: 0   字体:T|T

  本节接着上篇文章介绍SVN使用SVN子命令log,list,cat,diff查看所有及特定文件版本信息,本节主要介绍SVN子命令diff的用法,希望大家来一起学习。

  检查历史修改的详情

  我们已经看过SVN子命令 diff—使用标准区别文件格式显示区别,它在提交前用来显示本地工作拷贝与版本库的区别。

  事实上,SVN子命令diff有三种不同的用法:

  检查本地修改

  比较工作拷贝与版本库

  比较版本库与版本库

  比较本地修改

  像我们看到的,不使用任何参数调用时,svn diff将会比较你的工作文件与缓存在.svn的“原始”拷贝:

  $ svn diff

  Index: rules.txt

  ===================================================================

  --- rules.txt    (revision 3)

  +++ rules.txt    (working copy)

  @@ -1,4 +1,5 @@

  Be kind to others

  Freedom = Responsibility

  Everything in moderation

  -Chew with your mouth open

  +Chew with your mouth closed

  +Listen when others are speaking

  [/pre]比较工作拷贝和版本库

  如果传递一个--revision(-r)参数,你的工作拷贝会与指定的版本比较。

  $ svn diff -r 3 rules.txt

  Index: rules.txt

  ===================================================================

  --- rules.txt    (revision 3)

  +++ rules.txt    (working copy)

  @@ -1,4 +1,5 @@

  Be kind to others

  Freedom = Responsibility

  Everything in moderation

  -Chew with your mouth open

  +Chew with your mouth closed

  +Listen when others are speaking

  [/pre]SVN子命令diff比较版本库与版本库

  如果通过--revision (-r)传递两个通过冒号分开的版本号,这两个版本会进行比较。

  $ svn diff -r 2:3 rules.txt

  Index: rules.txt

  ===================================================================

  --- rules.txt    (revision 2)

  +++ rules.txt    (revision 3)

  @@ -1,4 +1,4 @@

  Be kind to others

  -Freedom = Chocolate Ice Cream

  +Freedom = Responsibility

  Everything in moderation

  Chew with your mouth open

  [/pre]与前一个修订版本比较更方便的办法是使用--change (-c):

  $ svn diff -c 3 rules.txt

  Index: rules.txt

  ===================================================================

  --- rules.txt    (revision 2)

  +++ rules.txt    (revision 3)

  @@ -1,4 +1,4 @@

  Be kind to others

  -Freedom = Chocolate Ice Cream

  +Freedom = Responsibility

  Everything in moderation

  Chew with your mouth open

  [/pre]最后,即使你在本机没有工作拷贝,还是可以比较版本库的修订版本,只需要在命令行中输入合适的URL:

  $ svn diff -c 5 http://svn.example.com/repos/example/trunk/text/rules.txt…

  [/pre]浏览版本库

  通过svn cat和svn list,你可以在未修改工作修订版本的情况下查看文件和目录的内容,实际上,你甚至也不需要有一个工作拷贝。

  SVN子命令 cat           

  如果你只是希望检查一个过去的版本而不希望察看它们的区别,使用svn cat:

  $ svn cat -r 2 rules.txt

  Be kind to others

  Freedom = Chocolate Ice Cream

  Everything in moderation

  Chew with your mouth open

  [/pre]你可以重定向输出到一个文件:

  $ svn cat -r 2 rules.txt > rules.txt.v2

  [/pre]              svn list           

  svn list可以在不下载文件到本地目录的情况下来察看目录中的文件:

  $ svn list http://svn.collab.net/repos/svn

  README,branches/,clients/,tags/,trunk/

  [/pre]如果你希望察看详细信息,你可以使用--verbose(-v) 参数:

  $ svn list -v http://svn.collab.net/repos/svn

  20620 harry            1084 Jul 13  2006 README

  23339 harry                 Feb 04 01:40 branches/

  21282 sally                 Aug 27 09:41 developer-resources/

  23198 harry                 Jan 23 17:17 tags/

  23351 sally                 Feb 05 13:26 trunk/

  [/pre]这些列告诉你文件和目录最后修改的修订版本、做出修改的用户、如果是文件还会有文件的大小,最后是修改日期和项目的名字。

  警告

  没有任何参数的SVN子命令 list命令缺省使用当前工作拷贝的版本库URL,而不是本地工作拷贝的目录。毕竟,如果你希望列出本地目录,你只需要使用ls(或任何合理的非UNIX等价物)。

  获得旧的版本库快照,除了以上的命令,你可以使用带参数--revision的svn update和svn checkout来使整个工作拷贝“回到过去”[8]:

  $ svn checkout -r 1729 # Checks out a new working copy at r1729…

  $ svn update -r 1729 # Updates an existing working copy to r1729…

  [/pre]提示许多Subversion新手使用前面的svn update实例来“回退”修改,但是你不能提交修改,你获得有新修订版本的过时工作拷贝也是没有用的。关于如何“回退”,我们可以看“找回删除的项目”一节。

  最后,如果你构建了一个版本,并且希望从Subversion打包文件,但是你不希望有讨厌的.svn目录,这时你可以导出版本库的一部分文件而没有.svn目录。就像svn update和svn checkout,你也可以传递--revision选项给svn export:

  $ svn export http://svn.example.com/svn/repos1 # Exports latest revision…

  $ svn export http://svn.example.com/svn/repos1 -r 1729

  # Exports revision r1729。部分SVN子命令相关内容讲解完毕。

 


0 0