所謂高級操作,只是曲高和寡,其實都不怎么用的。但是關鍵時候,可能會很有用。
這個高級只是針對基本操作而言。有些操作可能也是比較基本的。
清除鎖
有時候我們在操作的時候,可能系統崩潰了,或者SVN非正常結束了。由於SVN在Working Copy 改變時,會有一個 to_do_list ,並且鎖住了要改變的東西。改變以后恢復解鎖。當時如果正在這是系統非正常結束了。某些文件可能就被鎖住了。
$svn status
L somedir
L表示lock,被鎖住了。此時我們可以用cleaup來清除這樣的鎖。
$svn cleanup
$svn status
樹沖突
有時候,我們的沖突發生在刪除,移動一個文件時。例如我提交的時候,這個文件已經被更名了。此時的解決方法,和普通沖突類似。例如,code/bar.c 被改名為 code/baz.c
我們首先需要和發生沖突的同事商量,如果要保留baz.c那么就
$svn remove --force code/bar.c
$svn resolve --accept=working code/bar.c
$svn status
$svn diff
同樣,我們如果要保留bar.c那么把要removed和resolved的文件改成baz.c即可。
屬性
SVN的每個文件都可以增加一個屬性。屬性有自定義的,SVN原生的。屬性也分為有版本的,和無版本的等等。
屬性是一個有時很有用的東西,她一般用來存放一些元數據,額外的信息,方便獲取。也可以用來做一些有意思的事情。
對屬性的操作還是增刪改查
$svn propset copyright "(C) 2011 YDTF Software Inc." code/readme.txt
Property 'copyright' set on 'code/readme.txt'
$svn proplist code/readme.txt
$svn propdel ...
$svn propget
以上幾個命令,可以通過help查看詳細。
幾個SVN自帶的屬性介紹:
svn自帶幾個屬性以svn開頭。
1、svn:eol-style 表示的是行結束。
不同的操作系統,可能使用不同的行結束符號。
比如Window使用 CRLF。LF就是換行 CR就是回車。
而Unix中 只使用 LF。
這樣,這個svn:eol-style就有幾種值:
native; 根據本地定義
CRLF: 使用CRLF作為EOF(End-of-line)
LF:
CR
svn:ignore
Svn:ignore表示忽略Working Copy中的Unversioned文件。
當你使用svn status 時,你會發現,很多無關緊要的文件都列出來了。
於是我們可以使用svn:ignore忽略這些文件。比如 有很多 .bak文件。
我們可以設置 svn:ignore=*.bak 這樣所有后綴為bak 的文件,在svn status時就不見了。
$svn status
M mydir/foo.c
M mydir/bar.c
? mydir/bar.c.bak
? mydir/foo.c.bak
$svn propset svn:ignore mydir *.bak
$svn status
M mydir/foo.c
M mydir/bar.c
注意,ignore 使用類似正則的匹配。比如 ? 表示一個,*表示多個,[ 表示開始
但是這個屬性還會影響很多,諸如svn add * 時,
如果想把所有的文件加入到SVN庫 ,那么使用 svn add -* -force 即可。
3、svn:keywords
我們來編輯一個svn庫中的文本文件
$vi foo.c
$Date$
$Revision$
$Author$
#include<stdio.h>
...
:wq
$svn propset svn:keywords "Date Author" foo.c
$svn cat foo.c
$Author: yinshaoxin $
$Date: 2011-07-26 17:01:10 +0800 (Tue, 26 Jul 2011) $
$Revision$
#include<stdio.h>
...
於是SVN為我們的文檔自動加上了Author和Date。 這里注意,SVN命令有一個全局選項,那就是--username,這個涉及到SVN的認證和授權。你最好使用自己的帳號來操作SVN。
4 svn:needs-lock
這個屬性,用在一些不能同時多個人編輯的文件上。只有使用了lock鎖住文件,這些文件才能是可讀的,否則是不可讀的。
注意,這個屬性的值無關緊要。
$svn propset svn:needs-lock foo.jpg
這樣,我們如果要修改這個foo.jpg 那么,只能先執行
$svn lock foo.jpg
關於lock我們后面馬上就講到。這樣做並不是很嚴格的,但是某些時候很有用。例如,因為一些二進制文件,例如jpg文件是不可合並的。如果沒有鎖,兩個人可能同時做了很大的修改,但是有一個人的卻要是白費時間,因為他比另一個人玩提交,修改的地方是不可能自動合並的。為了不必要的浪費時間,Lock-Modify-Unlock的這種方式,就對我們很重要了。
5 svn:externals
當我們同時在兩個庫中工作時,我們可能在一個Working Copy中需要從另外一個庫中checkout文件。這時,svn:externals就很有用了。
$svn propedit svn:externals file:///var/idp2/svn/repos/src
third-party/souds file:///var/idp/svn/repos/souds
third-party/skin -r148 file:///var/idp/svn/repos/skin
注意,我們使用 propedit來編輯 這個屬性,因為她是多行的。
$svn checkout file:///var/idp2/svn/repos/src
A src
A src/Makefile
...
...
Checkd out revision 148
Fetching external item into src/third-party/souds
A src/third-party/sounds/ding.ogg
A src/third-party/sounds/dong.ogg
...
...
我們可以看到,checkout會吧external的屬性設置的庫也一起checkout出來了。
當我們用svn status看的時候
$svn status
E 表示External
X 表示 從external獲取的。
外部文件可以提交,只要這個外部文件是HEAD版本。
我們checkout的時候,如果不想check出external的,可以加 --ignore-externals
上面列舉的是一些有意思的SVN自帶屬性的,最好的原則是不去管他們。除非必要。
修改列表(Changelists)
有時候,我們修改的文件太多了,提交的時候,忘記了改了些什么文件,如果全部提交吧,不好區分填寫日志。於是我們把修改的某一類,加如一個changlists中。提交的時候指定提交這個changlists內的東西,這樣就避免了上述的問題。
$svn changlist sort-fixes sort.c list.c array.c
Path 'sort.c' now is a member of changlist 'sort-fixes'
Path 'list.c' now is a member of changlist 'sort-fixes'
Path 'array.c' now is a member of changlist 'sort-fixes'
$svn status --changelist 'math-fixes'
M sort.c
M list.c
M array.c
如果需要刪除,則使用svn changlist --remove
$svn changelist --remove sort.c
一但有了changlist,我們可以用來做很多事情。比如,比較文件的時候,我們只關心指定的chagnlist的。
$svn diff --changelist sort-fixes
$svn -commit -m "fix the sort bugs" --changelist sort-fixes
提交后的changelist自動被清除。如果想保留,使用 --keep-changelists
有意思的是,changelist命令也帶有--changelist選項,啊,遞歸。
我們需要注意的是,changlist只在Working Copy中有效,而且不能用於目錄。
本文摘自:https://airu.iteye.com/blog/1145030 版權歸作者所有