Other: Cache与存储,系统架构与硬件,搜索引擎技术,Shell ..... etc.
11/09
17
前几天酷壳发布过“vim简明攻略”,不知道大家练得怎么样了。如果你练了一下,那么这里这个速查卡就会对你有帮助了。以前本站也有过一个(vim速查卡),不过其太简单了。我觉得这个很不错,很全,很直观。这个速查卡来自这里。其用颜色标注了级别:
Green = 存活级
Yellow = 感觉良好
Orange / Blue = 高级
Red = 专家级
下面的图片点击可以看大图:

给程序员的VIM速查卡(点击看大图)
你还可以下载PDF版的和[url=Excel版的,如果你是色盲的话,还有蓝色版PDF的。如果你不是很喜欢的话,这里还有几个:
http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html
http://tnerual.eriogerg.free.fr/vim.html
http://www.lagmonster.org/docs/vi.html
http://jrmiii.com/2009/03/06/learning-vim-the-pragmatic-way.html
Green = 存活级
Yellow = 感觉良好
Orange / Blue = 高级
Red = 专家级
下面的图片点击可以看大图:
给程序员的VIM速查卡(点击看大图)
你还可以下载PDF版的和[url=Excel版的,如果你是色盲的话,还有蓝色版PDF的。如果你不是很喜欢的话,这里还有几个:
http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html
http://tnerual.eriogerg.free.fr/vim.html
http://www.lagmonster.org/docs/vi.html
http://jrmiii.com/2009/03/06/learning-vim-the-pragmatic-way.html
11/08
4
10/10
13
一篇不错的文章:使用VIM的十大理由
k 上
h l 左 右
j 下
^ 移动到该行第一个非空格的字符处
w 向前移动一个单词,将符号或标点当作单词处理
W 向前移动一个单词,不把符号或标点当作单词处理
b 向后移动一个单词,把符号或标点当作单词处理
B 向后移动一个单词,不把符号或标点当作单词处理
0 到行首
$ 到行尾
gg 到页首
G 到页末
行号+G 跳转到指定行
Ctrl+g 查询当前行信息和当前文件信息
fx 向右跳到本行字符x处(x可以是任何字符)
Fx 向左跳到本行字符x处(x可以是任何字符)
tx 和fx相同,区别是跳到字符x前
Tx 和Fx相同,区别是跳到字符x后
C-b 向上滚动一屏
C-f 向下滚动一屏
C-u 向上滚动半屏
C-d 向下滚动半屏
C-y 向上滚动一行
C-e 向下滚动一行
退出Vi
ZZ:退出vi并保存
:q! :退出vi,不保存
:wq :退出vi并保存
重复操作
.:重复上一次操作
自动补齐
C-n 匹配下一个关键字
C-p 匹配上一个关键字
插入
o:在光标下方新开一行并将光标置于新行行首,进入插入模式。
O:同上,在光标上方。
a:在光标之后进入插入模式。
A:同上,在光标之前。
R:进入替换模式,直到按下Esc
set xxx:设置XXX选项。
在Vi中删除
x: 删除当前光标下的字符
dw:删除光标之后的单词剩余部分。
d$:删除光标之后的该行剩余部分。
dd:删除当前行。
c: 功能和d相同,区别在于完成删除操作后进入INSERT MODE
cc:也是删除当前行,然后进入INSERT MODE
更改字符
rx:将当前光标下的字符更改为x(x为任意字符) ~: 更改当前光标下的字符的大小写
键盘宏操作
qcharacter:开始录制宏,character为a到z的任意字符
q:终止录制宏
@character:调用先前录制的宏
恢复误操作
u: 撤销最后执行的命令
U: 修正之前对该行的操作
Ctrl+R:Redo
在Vi中操作Frame
c-w c-n 增加frame
c-w c-c 减少frame
c-w c-w 切换frame
c-w c-r 交换两个frame
在Vi中查找
/ + 字符串:即可在当前文件查找相应的字符串。
继续查找同一个字符串,按n或/(ENTER),若要反向继续查找,按Shift+N。
若要逆向查找,用?代替 /
.*[]^%~$ 在Vi中具有特殊含义,若需要查找则应该加上转义字符"\"
% :查找配对的括号。
s/old/new/g:替换old为new,若没有g则表示只替换一个。
若要每个替换都向用户询问则应该用gc选项
查找的一些选项
设置高亮
:set hlsearch 设置高亮
:set nohlsearch 关闭高亮
:nohlsearch 关闭当前已经设置的高亮
增量查找
:set incsearch 设置增量查找
:set noincsearch 关闭增量查找
VIM中的块操作
Vim支持多达26个剪贴板
选块 先用v,C-v,V选择一块,然后用y复制,再用p粘贴。
yy 复制当前整行
nyy 复制当前行开始的n行内容
ayy 将光标当前行复制进寄存器a
ap 将寄存器a中的内容粘贴到光标位置之后。如果a是用yy复制的完整行,则粘贴在光标所在行下面。
aP 将寄存器a中的内容粘贴到光标位置之前。如果a是用yy复制的完整行,则粘贴在光标所在行上面。
ay[motion]
ay$ 复制光标位置到行末并保存在寄存器a中
ayft 复制光标位置到当前行第一个字母t并保存在寄存器a中
以上指令皆可去掉a工作,则y,p对未命名寄存器工作(所有d,c,x,y的对象都被保存在这里)。
剪切/复制/粘贴
所有删除的内容自动被保存,可以用p键粘贴
tips
对代码自动格式化 gg=G
k 上
h l 左 右
j 下
^ 移动到该行第一个非空格的字符处
w 向前移动一个单词,将符号或标点当作单词处理
W 向前移动一个单词,不把符号或标点当作单词处理
b 向后移动一个单词,把符号或标点当作单词处理
B 向后移动一个单词,不把符号或标点当作单词处理
0 到行首
$ 到行尾
gg 到页首
G 到页末
行号+G 跳转到指定行
Ctrl+g 查询当前行信息和当前文件信息
fx 向右跳到本行字符x处(x可以是任何字符)
Fx 向左跳到本行字符x处(x可以是任何字符)
tx 和fx相同,区别是跳到字符x前
Tx 和Fx相同,区别是跳到字符x后
C-b 向上滚动一屏
C-f 向下滚动一屏
C-u 向上滚动半屏
C-d 向下滚动半屏
C-y 向上滚动一行
C-e 向下滚动一行
退出Vi
ZZ:退出vi并保存
:q! :退出vi,不保存
:wq :退出vi并保存
重复操作
.:重复上一次操作
自动补齐
C-n 匹配下一个关键字
C-p 匹配上一个关键字
插入
o:在光标下方新开一行并将光标置于新行行首,进入插入模式。
O:同上,在光标上方。
a:在光标之后进入插入模式。
A:同上,在光标之前。
R:进入替换模式,直到按下Esc
set xxx:设置XXX选项。
在Vi中删除
x: 删除当前光标下的字符
dw:删除光标之后的单词剩余部分。
d$:删除光标之后的该行剩余部分。
dd:删除当前行。
c: 功能和d相同,区别在于完成删除操作后进入INSERT MODE
cc:也是删除当前行,然后进入INSERT MODE
更改字符
rx:将当前光标下的字符更改为x(x为任意字符) ~: 更改当前光标下的字符的大小写
键盘宏操作
qcharacter:开始录制宏,character为a到z的任意字符
q:终止录制宏
@character:调用先前录制的宏
恢复误操作
u: 撤销最后执行的命令
U: 修正之前对该行的操作
Ctrl+R:Redo
在Vi中操作Frame
c-w c-n 增加frame
c-w c-c 减少frame
c-w c-w 切换frame
c-w c-r 交换两个frame
在Vi中查找
/ + 字符串:即可在当前文件查找相应的字符串。
继续查找同一个字符串,按n或/(ENTER),若要反向继续查找,按Shift+N。
若要逆向查找,用?代替 /
.*[]^%~$ 在Vi中具有特殊含义,若需要查找则应该加上转义字符"\"
% :查找配对的括号。
s/old/new/g:替换old为new,若没有g则表示只替换一个。
若要每个替换都向用户询问则应该用gc选项
查找的一些选项
设置高亮
:set hlsearch 设置高亮
:set nohlsearch 关闭高亮
:nohlsearch 关闭当前已经设置的高亮
增量查找
:set incsearch 设置增量查找
:set noincsearch 关闭增量查找
VIM中的块操作
Vim支持多达26个剪贴板
选块 先用v,C-v,V选择一块,然后用y复制,再用p粘贴。
yy 复制当前整行
nyy 复制当前行开始的n行内容
ayy 将光标当前行复制进寄存器a
ap 将寄存器a中的内容粘贴到光标位置之后。如果a是用yy复制的完整行,则粘贴在光标所在行下面。
aP 将寄存器a中的内容粘贴到光标位置之前。如果a是用yy复制的完整行,则粘贴在光标所在行上面。
ay[motion]
ay$ 复制光标位置到行末并保存在寄存器a中
ayft 复制光标位置到当前行第一个字母t并保存在寄存器a中
以上指令皆可去掉a工作,则y,p对未命名寄存器工作(所有d,c,x,y的对象都被保存在这里)。
剪切/复制/粘贴
所有删除的内容自动被保存,可以用p键粘贴
tips
对代码自动格式化 gg=G
10/10
8
语法为 :[addr]s/源字符串/目的字符串/[option]
全局替换命令为::%s/源字符串/目的字符串/g
[addr] 表示检索范围,省略时表示当前行。
如:“1,20” :表示从第1行到20行;
“%” :表示整个文件,同“1,$”;
“. ,$” :从当前行到文件尾;
s : 表示替换操作
[option] : 表示操作类型
如:g 表示全局替换;
c 表示进行确认
p 表示替代结果逐行显示(Ctrl + L恢复屏幕);
省略option时仅对每行第一个匹配串进行替换;
如果在源字符串和目的字符串中出现特殊字符,需要用”\”转义
下面是一些例子:
#将That or this 换成 This or that
:%s/\(That\) or \(this\)/\u\2 or \l\1/
—-
#将句尾的child换成children
:%s/child\([ ,.;!:?]\)/children\1/g
—-
#将mgi/r/abox换成mgi/r/asquare
:g/mg\([ira]\)box/s//mg//my\1square/g <=> :g/mg[ira]box/s/box/square/g
—-
#将多个空格换成一个空格
:%s/ */ /g
—-
#使用空格替换句号或者冒号后面的一个或者多个空格
:%s/\([:.]\) */\1 /g
—-
#删除所有空行
:g/^$/d
—-
#删除所有的空白行和空行
:g/^[ ][ ]*$/d
—-
#在每行的开始插入两个空白
:%s/^/> /
—-
#在接下来的6行末尾加入.
:.,5/$/./
—-
#颠倒文件的行序
:g/.*/m0O <=> :g/^/m0O
—-
#寻找不是数字的开始行,并将其移到文件尾部
:g!/^[0-9]/m$ <=> g/^[^0-9]/m$
—-
#将文件的第12到17行内容复制10词放到当前文件的尾部
:1,10g/^/12,17t$
~~~~重复次数的作用
—-
#将chapter开始行下面的第二行的内容写道begin文件中
:g/^chapter/.+2w>>begin
—-
:/^part2/,/^part3/g/^chapter/.+2w>>begin
—-
:/^part2/,/^part3/g/^chapter/.+2w>>begin|+t$
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
: s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
删除文本中的^M
问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。
使用命令:cat filename1 | tr -d “^V^M” > newfile;
使用命令:sed -e “s/^V^M//” filename > outputfilename.需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M.你必须要手工进行输入,而不是粘贴。
在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//.
:%s/^M$//g
如果上述方法无用,则正确的解决办法是:
tr -d "\r" dest
tr -d "\015" dest
strings A>B
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g 功能同上
从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索
字符串的首次出现进行替换:g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
全局替换命令为::%s/源字符串/目的字符串/g
[addr] 表示检索范围,省略时表示当前行。
如:“1,20” :表示从第1行到20行;
“%” :表示整个文件,同“1,$”;
“. ,$” :从当前行到文件尾;
s : 表示替换操作
[option] : 表示操作类型
如:g 表示全局替换;
c 表示进行确认
p 表示替代结果逐行显示(Ctrl + L恢复屏幕);
省略option时仅对每行第一个匹配串进行替换;
如果在源字符串和目的字符串中出现特殊字符,需要用”\”转义
下面是一些例子:
#将That or this 换成 This or that
:%s/\(That\) or \(this\)/\u\2 or \l\1/
—-
#将句尾的child换成children
:%s/child\([ ,.;!:?]\)/children\1/g
—-
#将mgi/r/abox换成mgi/r/asquare
:g/mg\([ira]\)box/s//mg//my\1square/g <=> :g/mg[ira]box/s/box/square/g
—-
#将多个空格换成一个空格
:%s/ */ /g
—-
#使用空格替换句号或者冒号后面的一个或者多个空格
:%s/\([:.]\) */\1 /g
—-
#删除所有空行
:g/^$/d
—-
#删除所有的空白行和空行
:g/^[ ][ ]*$/d
—-
#在每行的开始插入两个空白
:%s/^/> /
—-
#在接下来的6行末尾加入.
:.,5/$/./
—-
#颠倒文件的行序
:g/.*/m0O <=> :g/^/m0O
—-
#寻找不是数字的开始行,并将其移到文件尾部
:g!/^[0-9]/m$ <=> g/^[^0-9]/m$
—-
#将文件的第12到17行内容复制10词放到当前文件的尾部
:1,10g/^/12,17t$
~~~~重复次数的作用
—-
#将chapter开始行下面的第二行的内容写道begin文件中
:g/^chapter/.+2w>>begin
—-
:/^part2/,/^part3/g/^chapter/.+2w>>begin
—-
:/^part2/,/^part3/g/^chapter/.+2w>>begin|+t$
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
: s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
删除文本中的^M
问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。
使用命令:cat filename1 | tr -d “^V^M” > newfile;
使用命令:sed -e “s/^V^M//” filename > outputfilename.需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M.你必须要手工进行输入,而不是粘贴。
在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//.
:%s/^M$//g
如果上述方法无用,则正确的解决办法是:
tr -d "\r" dest
tr -d "\015" dest
strings A>B
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g 功能同上
从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索
字符串的首次出现进行替换:g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
10/09
30
这是一篇隐藏日志。您需要以合适的身份登入后才能查看。
10/09
29
编号 中文名称 英文名称 面积(平方度) 位置 观看季节 1-2-3-4等星的数目
1 仙女座 Andromeda 722 北面 秋季 0-3-1-11
2 唧筒座 Antlia 239 南面 春季 0-0-0-1
3 天燕座 Apus 206 南面 0-0-0-3
4 宝瓶座 Aquarius 980 天赤附近 秋季 0-0-2-13
5 天鹰座 Aquila 652 天赤附近 夏季 1-0-4-6
6 天坛座 Ara 237 南面 夏季 0-0-3-5
7 白羊座 Aries 441 天赤附近 秋季 0-1-1-2
8 御夫座 Auriga 657 北面 冬季 1-1-4-4
9 牧夫座 Bootes 907 天赤附近 春季 1-0-3-10
10 雕具座 Caelum 125 南面 冬季 0-0-0-0
11 鹿豹座 Camelopardalis 757 北面 冬季 0-0-0-4
12 巨蟹座 Cancer 506 天赤附近 冬季 0-0-0-6
13 猎犬座 Canes Venatici 465 北面 春季 0-0-1-1
14 大犬座 Canis Major 380 天赤附近 冬季 1-4-2-11
15 小犬座 Canis Minor 183 天赤附近 冬季 1-0-1-0
16 摩羯座 Capricornus 414 天赤附近 秋季 0-0-2-7
17 船底座 Carina 494 南面 冬季 1-3-3-18
18 仙后座 Cassiopeia 598 北面 秋季 0-3-2-5
19 半人马座 Centaurus 1060 南面 春季 2-2-8-21
20 仙王座 Cepheus 588 北面 秋季 0-0-3-10
21 鲸鱼座 Cetus 1231 天赤附近 秋季 0-2-1-11
22 蝘蜓座 Chamaeleon 132 南面 0-0-0-4
23 圆规座 Circinus 93 南面 春季 0-0-1-1
24 天鸽座 Columba 270 南面 冬季 0-0-2-4
25 后发座 Coma Berenices 386 天赤附近 春季 0-0-0-2
26 南冕座 Corona Australis 128 南面 夏季 0-0-0-4
27 北冕座 Corona Borealis 179 天赤附近 夏季 0-1-0-4
28 乌鸦座 Corvus 184 天赤附近 春季 0-0-4-2
29 巨爵座 Crater 282 天赤附近 春季 0-0-0-3
30 南十字座 Crux 68 南面 春季 1-2-1-5
31 天鹅座 Cygnus 804 北面 夏季 1-1-4-18
32 海豚座 Delphinus 189 天赤附近 夏季 0-0-0-4
33 剑鱼座 Dorado 179 南面 冬季 0-0-1-2
34 天龙座 Draco 1083 北面 夏季 0-1-5-9
35 小马座 Equuleus 72 天赤附近 秋季 0-0-0-1
36 波江座 Eridanus 1138 天赤附近 冬季 1-0-3-24
37 天炉座 Fornax 398 天赤附近 秋季 0-0-0-1
38 双子座 Gemini 514 天赤附近 冬季 1-2-4-12
39 天鹤座 Grus 366 南面 秋季 0-2-1-6
40 武仙座 Hercules 1225 天赤附近 夏季 0-0-6-19
41 时钟座 Horologium 249 南面 冬季 0-0-0-2
42 长蛇座 Hydra 1303 天赤附近 春季 0-1-5-13
43 水蛇座 Hydrus 243 南面 秋季 0-0-3-2
44 印第安座 Indus 294 南面 秋季 0-0-1-2
45 蝎虎座 Lacerta 201 北面 秋季 0-0-0-2
46 狮子座 Leo 947 天赤附近 春季 1-2-3-12
47 小狮座 Leo Minor 232 天赤附近 春季 0-0-0-3
48 天兔座 Lepus 290 天赤附近 冬季 0-0-4-6
49 天秤座 Libra 538 天赤附近 夏季 0-0-3-4
50 豺狼座 Lupus 334 南面 夏季 0-0-4-16
51 天猫座 Lynx 545 北面 冬季 0-0-1-5
52 天琴座 Lyra 286 北面 夏季 1-0-2-6
53 山案座 Mensa 153 南面 0-0-0-0
54 显微镜座 Microscopium 210 南面 秋季 0-0-0-0
55 麒麟座 Monoceros 482 天赤附近 冬季 0-0-3-6
56 苍蝇座 Musca 138 南面 0-0-2-4
57 矩尺座 Norma 165 南面 夏季 0-0-0-1
58 南极座 Octans 291 南面 0-0-0-3
59 蛇夫座 Ophiuchus 948 天赤附近 夏季 0-1-7-15
60 猎户座 Orion 594 天赤附近 冬季 2-5-3-15
61 孔雀座 Pavo 378 南面 夏季 0-1-0-10
62 飞马座 Pegasus 1121 天赤附近 秋季 0-1-4-9
63 英仙座 Perseus 615 北面 冬季 0-2-5-15
64 凤凰座 Phoenix 469 南面 秋季 0-1-2-5
65 绘架座 Pictor 247 南面 冬季 0-0-1-2
66 双鱼座 Pisces 889 天赤附近 秋季 0-0-0-7
67 南鱼座 Piscis Austrinus 245 天赤附近 秋季 1-0-0-5
68 船尾座 Puppis 673 天赤附近 冬季 0-1-7-13
69 罗盘座 Pyxis 221 天赤附近 春季 0-0-0-3
70 网罟座 Reticulum 114 南面 冬季 0-0-1-4
71 天箭座 Sagitta 80 天赤附近 夏季 0-0-0-4
72 人马座 Sagittarius 867 天赤附近 夏季 0-2-8-10
73 天蝎座 Scorpius 497 天赤附近 夏季 1-3-10-10
74 玉夫座 Sculptor 475 天赤附近 秋季 0-0-0-2
75 盾牌座 Scutum 109 天赤附近 夏季 0-0-0-2
76a 巨蛇座 (头) Serpens 637 天赤附近 夏季 0-0-0-12
76b 巨蛇座 (尾) Sextans 314 天赤附近 春季 0-0-0-0
77 六分仪座 Taurus 797 天赤附近 冬季 1-1-2-23
78 金牛座 Telescopium 252 南面 夏季 0-0-0-2
79 望远镜座 Triangulum 132 天赤附近 秋季 0-0-1-2
80 三角座 Triangulum Austale 110 南面 夏季 0-1-1-2
81 南三角 Tucana 295 南面 秋季 0-0-1-3
82 杜鹃座 Ursa Major 1280 北面 春季 0-5-7-8
83 大熊座 Ursa Minor 256 北面 夏季 0-2-1-4
84 小熊座 Vela 500 南面 春季 0-3-2-14
85 船帆座 Virgo 1294 天赤附近 春季 1-0-3-11
86 室女座 Volans 141 南面 0-0-0-6
87 飞鱼座 Vulpecula 268 天赤附近 夏季 0-0-0-0
1 仙女座 Andromeda 722 北面 秋季 0-3-1-11
2 唧筒座 Antlia 239 南面 春季 0-0-0-1
3 天燕座 Apus 206 南面 0-0-0-3
4 宝瓶座 Aquarius 980 天赤附近 秋季 0-0-2-13
5 天鹰座 Aquila 652 天赤附近 夏季 1-0-4-6
6 天坛座 Ara 237 南面 夏季 0-0-3-5
7 白羊座 Aries 441 天赤附近 秋季 0-1-1-2
8 御夫座 Auriga 657 北面 冬季 1-1-4-4
9 牧夫座 Bootes 907 天赤附近 春季 1-0-3-10
10 雕具座 Caelum 125 南面 冬季 0-0-0-0
11 鹿豹座 Camelopardalis 757 北面 冬季 0-0-0-4
12 巨蟹座 Cancer 506 天赤附近 冬季 0-0-0-6
13 猎犬座 Canes Venatici 465 北面 春季 0-0-1-1
14 大犬座 Canis Major 380 天赤附近 冬季 1-4-2-11
15 小犬座 Canis Minor 183 天赤附近 冬季 1-0-1-0
16 摩羯座 Capricornus 414 天赤附近 秋季 0-0-2-7
17 船底座 Carina 494 南面 冬季 1-3-3-18
18 仙后座 Cassiopeia 598 北面 秋季 0-3-2-5
19 半人马座 Centaurus 1060 南面 春季 2-2-8-21
20 仙王座 Cepheus 588 北面 秋季 0-0-3-10
21 鲸鱼座 Cetus 1231 天赤附近 秋季 0-2-1-11
22 蝘蜓座 Chamaeleon 132 南面 0-0-0-4
23 圆规座 Circinus 93 南面 春季 0-0-1-1
24 天鸽座 Columba 270 南面 冬季 0-0-2-4
25 后发座 Coma Berenices 386 天赤附近 春季 0-0-0-2
26 南冕座 Corona Australis 128 南面 夏季 0-0-0-4
27 北冕座 Corona Borealis 179 天赤附近 夏季 0-1-0-4
28 乌鸦座 Corvus 184 天赤附近 春季 0-0-4-2
29 巨爵座 Crater 282 天赤附近 春季 0-0-0-3
30 南十字座 Crux 68 南面 春季 1-2-1-5
31 天鹅座 Cygnus 804 北面 夏季 1-1-4-18
32 海豚座 Delphinus 189 天赤附近 夏季 0-0-0-4
33 剑鱼座 Dorado 179 南面 冬季 0-0-1-2
34 天龙座 Draco 1083 北面 夏季 0-1-5-9
35 小马座 Equuleus 72 天赤附近 秋季 0-0-0-1
36 波江座 Eridanus 1138 天赤附近 冬季 1-0-3-24
37 天炉座 Fornax 398 天赤附近 秋季 0-0-0-1
38 双子座 Gemini 514 天赤附近 冬季 1-2-4-12
39 天鹤座 Grus 366 南面 秋季 0-2-1-6
40 武仙座 Hercules 1225 天赤附近 夏季 0-0-6-19
41 时钟座 Horologium 249 南面 冬季 0-0-0-2
42 长蛇座 Hydra 1303 天赤附近 春季 0-1-5-13
43 水蛇座 Hydrus 243 南面 秋季 0-0-3-2
44 印第安座 Indus 294 南面 秋季 0-0-1-2
45 蝎虎座 Lacerta 201 北面 秋季 0-0-0-2
46 狮子座 Leo 947 天赤附近 春季 1-2-3-12
47 小狮座 Leo Minor 232 天赤附近 春季 0-0-0-3
48 天兔座 Lepus 290 天赤附近 冬季 0-0-4-6
49 天秤座 Libra 538 天赤附近 夏季 0-0-3-4
50 豺狼座 Lupus 334 南面 夏季 0-0-4-16
51 天猫座 Lynx 545 北面 冬季 0-0-1-5
52 天琴座 Lyra 286 北面 夏季 1-0-2-6
53 山案座 Mensa 153 南面 0-0-0-0
54 显微镜座 Microscopium 210 南面 秋季 0-0-0-0
55 麒麟座 Monoceros 482 天赤附近 冬季 0-0-3-6
56 苍蝇座 Musca 138 南面 0-0-2-4
57 矩尺座 Norma 165 南面 夏季 0-0-0-1
58 南极座 Octans 291 南面 0-0-0-3
59 蛇夫座 Ophiuchus 948 天赤附近 夏季 0-1-7-15
60 猎户座 Orion 594 天赤附近 冬季 2-5-3-15
61 孔雀座 Pavo 378 南面 夏季 0-1-0-10
62 飞马座 Pegasus 1121 天赤附近 秋季 0-1-4-9
63 英仙座 Perseus 615 北面 冬季 0-2-5-15
64 凤凰座 Phoenix 469 南面 秋季 0-1-2-5
65 绘架座 Pictor 247 南面 冬季 0-0-1-2
66 双鱼座 Pisces 889 天赤附近 秋季 0-0-0-7
67 南鱼座 Piscis Austrinus 245 天赤附近 秋季 1-0-0-5
68 船尾座 Puppis 673 天赤附近 冬季 0-1-7-13
69 罗盘座 Pyxis 221 天赤附近 春季 0-0-0-3
70 网罟座 Reticulum 114 南面 冬季 0-0-1-4
71 天箭座 Sagitta 80 天赤附近 夏季 0-0-0-4
72 人马座 Sagittarius 867 天赤附近 夏季 0-2-8-10
73 天蝎座 Scorpius 497 天赤附近 夏季 1-3-10-10
74 玉夫座 Sculptor 475 天赤附近 秋季 0-0-0-2
75 盾牌座 Scutum 109 天赤附近 夏季 0-0-0-2
76a 巨蛇座 (头) Serpens 637 天赤附近 夏季 0-0-0-12
76b 巨蛇座 (尾) Sextans 314 天赤附近 春季 0-0-0-0
77 六分仪座 Taurus 797 天赤附近 冬季 1-1-2-23
78 金牛座 Telescopium 252 南面 夏季 0-0-0-2
79 望远镜座 Triangulum 132 天赤附近 秋季 0-0-1-2
80 三角座 Triangulum Austale 110 南面 夏季 0-1-1-2
81 南三角 Tucana 295 南面 秋季 0-0-1-3
82 杜鹃座 Ursa Major 1280 北面 春季 0-5-7-8
83 大熊座 Ursa Minor 256 北面 夏季 0-2-1-4
84 小熊座 Vela 500 南面 春季 0-3-2-14
85 船帆座 Virgo 1294 天赤附近 春季 1-0-3-11
86 室女座 Volans 141 南面 0-0-0-6
87 飞鱼座 Vulpecula 268 天赤附近 夏季 0-0-0-0
10/08
28
http://forum.ubuntu.org.cn/viewtopic.php?t=20852
首先当然是要安装samba了,呵呵:
代码:
sudo apt-get install samba
sudo apt-get install smbfs
下面我们来共享群组可读写文件夹,假设你要共享的文件夹为: /home/ray/share
首先创建这个文件夹
代码:
mkdir /home/ray/share
chmod 777 /home/ray/share
备份并编辑smb.conf允许网络用户访问
代码:
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup
sudo gedit /etc/samba/smb.conf
搜寻这一行文字
代码:
; security = user
用下面这几行取代
代码:
security = user
username map = /etc/samba/smbusers
将下列几行新增到文件的最后面,假设允许访问的用户为:newsfan。而文件夹的共享名为 Share
代码:
[Share]
comment = Shared Folder with username and password
path = /home/ray/share
public = yes
writable = yes
valid users = newsfan
create mask = 0700
directory mask = 0700
force user = nobody
force group = nogroup
available = yes
browseable = yes
然后顺便把这里改一下,找到[global]把 workgroup = MSHOME 改成
代码:
workgroup = WORKGROUP
display charset = UTF-8
unix charset = UTF-8
dos charset = cp936
后面的三行是为了防止出现中文目录乱码的情况。其中根据你的local,UTF-8 有可能需要改成 cp936。自己看着办吧。
现在要添加newsfan这个网络访问帐户。如果系统中当前没有这个帐户,那么
代码:
sudo useradd newsfan
要注意,上面只是增加了newsfan这个用户,却没有给用户赋予本机登录密码。所以这个用户将只能从远程访问,不能从本机登录。而且samba的登录密码可以和本机登录密码不一样。
现在要新增网络使用者的帐号:
代码:
sudo smbpasswd -a newsfan
sudo gedit /etc/samba/smbusers
在新建立的文件内加入下面这一行并保存
代码:
newsfan = "network username"
如果将来需要更改newsfan的网络访问密码,也用这个命令更改
代码:
sudo smbpasswd -a newsfan
删除网络使用者的帐号的命令把上面的 -a 改成 -x
代码:
sudo testparm
sudo /etc/init.d/samba restart
最后退出重新登录或者重新启动一下机器。
首先当然是要安装samba了,呵呵:
代码:
sudo apt-get install samba
sudo apt-get install smbfs
下面我们来共享群组可读写文件夹,假设你要共享的文件夹为: /home/ray/share
首先创建这个文件夹
代码:
mkdir /home/ray/share
chmod 777 /home/ray/share
备份并编辑smb.conf允许网络用户访问
代码:
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup
sudo gedit /etc/samba/smb.conf
搜寻这一行文字
代码:
; security = user
用下面这几行取代
代码:
security = user
username map = /etc/samba/smbusers
将下列几行新增到文件的最后面,假设允许访问的用户为:newsfan。而文件夹的共享名为 Share
代码:
[Share]
comment = Shared Folder with username and password
path = /home/ray/share
public = yes
writable = yes
valid users = newsfan
create mask = 0700
directory mask = 0700
force user = nobody
force group = nogroup
available = yes
browseable = yes
然后顺便把这里改一下,找到[global]把 workgroup = MSHOME 改成
代码:
workgroup = WORKGROUP
display charset = UTF-8
unix charset = UTF-8
dos charset = cp936
后面的三行是为了防止出现中文目录乱码的情况。其中根据你的local,UTF-8 有可能需要改成 cp936。自己看着办吧。
现在要添加newsfan这个网络访问帐户。如果系统中当前没有这个帐户,那么
代码:
sudo useradd newsfan
要注意,上面只是增加了newsfan这个用户,却没有给用户赋予本机登录密码。所以这个用户将只能从远程访问,不能从本机登录。而且samba的登录密码可以和本机登录密码不一样。
现在要新增网络使用者的帐号:
代码:
sudo smbpasswd -a newsfan
sudo gedit /etc/samba/smbusers
在新建立的文件内加入下面这一行并保存
代码:
newsfan = "network username"
如果将来需要更改newsfan的网络访问密码,也用这个命令更改
代码:
sudo smbpasswd -a newsfan
删除网络使用者的帐号的命令把上面的 -a 改成 -x
代码:
sudo testparm
sudo /etc/init.d/samba restart
最后退出重新登录或者重新启动一下机器。
10/08
26
开发人员常用命令
(1) 导入项目
$ cd ~/project
$ mkdir -p svntest/{trunk,branches,tags}
$ svn import svntest https://localhost/test/svntest --username jasonyu --message "Start project"
...
$ rm -rf svntest
我们新建一个项目svntest,在该项目下新建三个子目录:trunk,开发主干;branches,开发分支;tags,开发阶段性标签。然后导入到版本库test下,然后把svntest拿掉。
(2) 导出项目
$ svn checkout https://localhost/test/svntest/trunk
或
$ svn co https://localhost/test/svntest/trunk svntest
修订版本号的指定方式是每个开发人员必须了解的,以下是几个参考例子,说明可参考svn推荐书。
$ svn diff --revision PREV:COMMITTED foo.c
# shows the last change committed to foo.c
$ svn log --revision HEAD
# shows log message for the latest repository commit
$ svn diff --revision HEAD
# compares your working file (with local changes) to the latest version
# in the repository
$ svn diff --revision BASE:HEAD foo.c
# compares your “pristine” foo.c (no local changes) with the
# latest version in the repository
$ svn log --revision BASE:HEAD
# shows all commit logs since you last updated
$ svn update --revision PREV foo.c
# rewinds the last change on foo.c
# (foo.c's working revision is decreased)
$ svn checkout --revision 3
# specified with revision number
$ svn checkout --revision {2002-02-17}
$ svn checkout --revision {15:30}
$ svn checkout --revision {15:30:00.200000}
$ svn checkout --revision {"2002-02-17 15:30"}
$ svn checkout --revision {"2002-02-17 15:30 +0230"}
$ svn checkout --revision {2002-02-17T15:30}
$ svn checkout --revision {2002-02-17T15:30Z}
$ svn checkout --revision {2002-02-17T15:30-04:00}
$ svn checkout --revision {20020217T1530}
$ svn checkout --revision {20020217T1530Z}
$ svn checkout --revision {20020217T1530-0500}
(3) 日常指令
$ svn update
$ svn add foo.file
$ svn add foo1.dir
$ svn add foo2.dir --non-recursive
$ svn delete README
$ svn copy foo bar
$ svn move foo1 bar1
$ svn status
$ svn status --verbose
$ svn status --verbose --show-updates
$ svn status stuff/fox.c
$ svn diff
$ svn diff > patchfile
$ svn revert README
$ svn revert
修改冲突发生时,会生成三个文件:.mine, .rOLDREV, .rNEWREV。比如:
$ ls -l
sandwich.txt
sandwich.txt.mine
sandwich.txt.r1
sandwich.txt.r2
解决修改冲突方式之一:修改冲突的文件sandwich.txt,然后运行命令:
$ svn resolved sandwich.txt
方式之二:用库里的新版本覆盖你的修改:
$ cp sandwich.txt.r2 sandwich.txt
$ svn resolved sandwich.txt
方式之三:撤销你的修改,这种方式不需要运行resolved子命令:
$ svn revert sandwich.txt
Reverted 'sandwich.txt'
$ ls sandwich.*
sandwich.txt
确保没问题后,就可以提交了。
$ svn commit --message "Correct some fatal problems"
$ svn commit --file logmsg
$ svn commit
(4) 检验版本历史
$ svn log
$ svn log --revision 5:19
$ svn log foo.c
$ svn log -r 8 -v
$ svn diff
$ svn diff --revision 3 rules.txt
$ svn diff --revision 2:3 rules.txt
$ svn diff --revision 4:5 http://svn.red-bean.com/repos/example/trunk/text/rules.txt
$ svn cat --revision 2 rules.txt
$ svn cat --revision 2 rules.txt > rules.txt.v2
$ svn list http://svn.collab.net/repos/svn
$ svn list --verbose http://svn.collab.net/repos/svn
$ svn checkout --revision 1729 # Checks out a new working copy at r1729
…
$ svn update --revision 1729 # Updates an existing working copy to r1729
…
(5) 其他有用的命令
svn cleanup
为失败的事务清场。
(6) 分支和合并
建立分支方法一:先checkout然后做拷贝,最后提交拷贝。
$ svn checkout http://svn.example.com/repos/calc bigwc
A bigwc/trunk/
A bigwc/trunk/Makefile
A bigwc/trunk/integer.c
A bigwc/trunk/button.c
A bigwc/branches/
Checked out revision 340.
$ cd bigwc
$ svn copy trunk branches/my-calc-branch
$ svn status
A + branches/my-calc-branch
$ svn commit -m "Creating a private branch of /calc/trunk."
Adding branches/my-calc-branch
Committed revision 341.
建立分支方法二:直接远程拷贝。
$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Creating a private branch of /calc/trunk."
Committed revision 341.
建立分支后,你可以把分支checkout并继续你的开发。
$ svn checkout http://svn.example.com/repos/calc/branches/my-calc-branch
假设你已经checkout了主干,现在想切换到某个分支开发,可做如下的操作:
$ cd calc
$ svn info | grep URL
URL: http://svn.example.com/repos/calc/trunk
$ svn switch http://svn.example.com/repos/calc/branches/my-calc-branch
U integer.c
U button.c
U Makefile
Updated to revision 341.
$ svn info | grep URL
URL: http://svn.example.com/repos/calc/branches/my-calc-branch
合并文件的命令参考:
$ svn diff -r 343:344 http://svn.example.com/repos/calc/trunk
$ svn merge -r 343:344 http://svn.example.com/repos/calc/trunk
$ svn commit -m "integer.c: ported r344 (spelling fixes) from trunk."
$ svn merge -r 343:344 http://svn.example.com/repos/calc/trunk my-calc-branch
$ svn merge http://svn.example.com/repos/branch1@150 \
http://svn.example.com/repos/branch2@212 \
my-working-copy
$ svn merge -r 100:200 http://svn.example.com/repos/trunk my-working-copy
$ svn merge -r 100:200 http://svn.example.com/repos/trunk
$ svn merge --dry-run -r 343:344 http://svn.example.com/repos/calc/trunk
最后一条命令仅仅做合并测试,并不执行合并操作。
建立标签和建立分支没什么区别,不过是拷贝到不同的目录而已。
$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/tags/release-1.0 \
-m "Tagging the 1.0 release of the 'calc' project."
$ ls
my-working-copy/
$ svn copy my-working-copy http://svn.example.com/repos/calc/tags/mytag
Committed revision 352.
后一种方式直接把本地的工作拷贝复制为标签。
此外,你还可以删除某个分支。
$ svn delete http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Removing obsolete branch of calc project."
管理人员常用命令
(7) 版本库管理
$ svnadmin help
...
$ svnadmin help create
...
$ svnadmin create --fs-type bdb /usr/local/repository/svn/test
$ chown -R svn.svn /usr/local/repository/svn/test
建立版本库,库类型为bdb(使用Berkeley DB做仓库),库名称为test。
svn版本库有两种存储方式:基于Berkeley DB(bdb)或者基于文件系统(fsfs),通过 --fs-type可指定存储方式。
(8) 查询版本库信息
$ svnlook help
...
$ svnlook help tree
...
$ svnlook tree /usr/local/repository/svn/test --show-ids
...
更详细的命令,请参考SVN官方推荐的书(http://svnbook.red-bean.com/)。这本书有中译版,而且是免费的。
(1) 导入项目
$ cd ~/project
$ mkdir -p svntest/{trunk,branches,tags}
$ svn import svntest https://localhost/test/svntest --username jasonyu --message "Start project"
...
$ rm -rf svntest
我们新建一个项目svntest,在该项目下新建三个子目录:trunk,开发主干;branches,开发分支;tags,开发阶段性标签。然后导入到版本库test下,然后把svntest拿掉。
(2) 导出项目
$ svn checkout https://localhost/test/svntest/trunk
或
$ svn co https://localhost/test/svntest/trunk svntest
修订版本号的指定方式是每个开发人员必须了解的,以下是几个参考例子,说明可参考svn推荐书。
$ svn diff --revision PREV:COMMITTED foo.c
# shows the last change committed to foo.c
$ svn log --revision HEAD
# shows log message for the latest repository commit
$ svn diff --revision HEAD
# compares your working file (with local changes) to the latest version
# in the repository
$ svn diff --revision BASE:HEAD foo.c
# compares your “pristine” foo.c (no local changes) with the
# latest version in the repository
$ svn log --revision BASE:HEAD
# shows all commit logs since you last updated
$ svn update --revision PREV foo.c
# rewinds the last change on foo.c
# (foo.c's working revision is decreased)
$ svn checkout --revision 3
# specified with revision number
$ svn checkout --revision {2002-02-17}
$ svn checkout --revision {15:30}
$ svn checkout --revision {15:30:00.200000}
$ svn checkout --revision {"2002-02-17 15:30"}
$ svn checkout --revision {"2002-02-17 15:30 +0230"}
$ svn checkout --revision {2002-02-17T15:30}
$ svn checkout --revision {2002-02-17T15:30Z}
$ svn checkout --revision {2002-02-17T15:30-04:00}
$ svn checkout --revision {20020217T1530}
$ svn checkout --revision {20020217T1530Z}
$ svn checkout --revision {20020217T1530-0500}
(3) 日常指令
$ svn update
$ svn add foo.file
$ svn add foo1.dir
$ svn add foo2.dir --non-recursive
$ svn delete README
$ svn copy foo bar
$ svn move foo1 bar1
$ svn status
$ svn status --verbose
$ svn status --verbose --show-updates
$ svn status stuff/fox.c
$ svn diff
$ svn diff > patchfile
$ svn revert README
$ svn revert
修改冲突发生时,会生成三个文件:.mine, .rOLDREV, .rNEWREV。比如:
$ ls -l
sandwich.txt
sandwich.txt.mine
sandwich.txt.r1
sandwich.txt.r2
解决修改冲突方式之一:修改冲突的文件sandwich.txt,然后运行命令:
$ svn resolved sandwich.txt
方式之二:用库里的新版本覆盖你的修改:
$ cp sandwich.txt.r2 sandwich.txt
$ svn resolved sandwich.txt
方式之三:撤销你的修改,这种方式不需要运行resolved子命令:
$ svn revert sandwich.txt
Reverted 'sandwich.txt'
$ ls sandwich.*
sandwich.txt
确保没问题后,就可以提交了。
$ svn commit --message "Correct some fatal problems"
$ svn commit --file logmsg
$ svn commit
(4) 检验版本历史
$ svn log
$ svn log --revision 5:19
$ svn log foo.c
$ svn log -r 8 -v
$ svn diff
$ svn diff --revision 3 rules.txt
$ svn diff --revision 2:3 rules.txt
$ svn diff --revision 4:5 http://svn.red-bean.com/repos/example/trunk/text/rules.txt
$ svn cat --revision 2 rules.txt
$ svn cat --revision 2 rules.txt > rules.txt.v2
$ svn list http://svn.collab.net/repos/svn
$ svn list --verbose http://svn.collab.net/repos/svn
$ svn checkout --revision 1729 # Checks out a new working copy at r1729
…
$ svn update --revision 1729 # Updates an existing working copy to r1729
…
(5) 其他有用的命令
svn cleanup
为失败的事务清场。
(6) 分支和合并
建立分支方法一:先checkout然后做拷贝,最后提交拷贝。
$ svn checkout http://svn.example.com/repos/calc bigwc
A bigwc/trunk/
A bigwc/trunk/Makefile
A bigwc/trunk/integer.c
A bigwc/trunk/button.c
A bigwc/branches/
Checked out revision 340.
$ cd bigwc
$ svn copy trunk branches/my-calc-branch
$ svn status
A + branches/my-calc-branch
$ svn commit -m "Creating a private branch of /calc/trunk."
Adding branches/my-calc-branch
Committed revision 341.
建立分支方法二:直接远程拷贝。
$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Creating a private branch of /calc/trunk."
Committed revision 341.
建立分支后,你可以把分支checkout并继续你的开发。
$ svn checkout http://svn.example.com/repos/calc/branches/my-calc-branch
假设你已经checkout了主干,现在想切换到某个分支开发,可做如下的操作:
$ cd calc
$ svn info | grep URL
URL: http://svn.example.com/repos/calc/trunk
$ svn switch http://svn.example.com/repos/calc/branches/my-calc-branch
U integer.c
U button.c
U Makefile
Updated to revision 341.
$ svn info | grep URL
URL: http://svn.example.com/repos/calc/branches/my-calc-branch
合并文件的命令参考:
$ svn diff -r 343:344 http://svn.example.com/repos/calc/trunk
$ svn merge -r 343:344 http://svn.example.com/repos/calc/trunk
$ svn commit -m "integer.c: ported r344 (spelling fixes) from trunk."
$ svn merge -r 343:344 http://svn.example.com/repos/calc/trunk my-calc-branch
$ svn merge http://svn.example.com/repos/branch1@150 \
http://svn.example.com/repos/branch2@212 \
my-working-copy
$ svn merge -r 100:200 http://svn.example.com/repos/trunk my-working-copy
$ svn merge -r 100:200 http://svn.example.com/repos/trunk
$ svn merge --dry-run -r 343:344 http://svn.example.com/repos/calc/trunk
最后一条命令仅仅做合并测试,并不执行合并操作。
建立标签和建立分支没什么区别,不过是拷贝到不同的目录而已。
$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/tags/release-1.0 \
-m "Tagging the 1.0 release of the 'calc' project."
$ ls
my-working-copy/
$ svn copy my-working-copy http://svn.example.com/repos/calc/tags/mytag
Committed revision 352.
后一种方式直接把本地的工作拷贝复制为标签。
此外,你还可以删除某个分支。
$ svn delete http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Removing obsolete branch of calc project."
管理人员常用命令
(7) 版本库管理
$ svnadmin help
...
$ svnadmin help create
...
$ svnadmin create --fs-type bdb /usr/local/repository/svn/test
$ chown -R svn.svn /usr/local/repository/svn/test
建立版本库,库类型为bdb(使用Berkeley DB做仓库),库名称为test。
svn版本库有两种存储方式:基于Berkeley DB(bdb)或者基于文件系统(fsfs),通过 --fs-type可指定存储方式。
(8) 查询版本库信息
$ svnlook help
...
$ svnlook help tree
...
$ svnlook tree /usr/local/repository/svn/test --show-ids
...
更详细的命令,请参考SVN官方推荐的书(http://svnbook.red-bean.com/)。这本书有中译版,而且是免费的。





