一、安装Samba

sudo apt-get install samba samba-common

新建共享目录并设置权限

#新建共享目录default
simon@Ubuntu:~$ sudo mkdir /home/wwwroot/default
#用户就对共享目录有了写权限
simon@Ubuntu:~$ sudo chmod 777 /home/wwwroot/default/

创建Samba配置文件

#备份现有配置文件
simon@Ubuntu:~$ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
#修改配置
simon@Ubuntu:~$ sudo vim /etc/samba/smb.conf

文件中相关属性如下:

1)全局设置部分[global]

security = user

这行设置了samba的安全等级,Samba一共可以设置四个安全等级,由底到高分别为:
share        这个选项表示任何人都可以不需要输入密码登录。 
user          这个是Samba的默认级别,要求每个用户必须输入密码才能登录。
server      user级别的密码都是保存在本机上,而server级别的密码和用户名都保存在另一台主机上。
domain    这个级别要求网络里必须有一台Windows的域控制器,验证工作由域控制器来完成。
需要注意,只要输入用户名和密码的级别,其用户名一定首先也是Linux系统内的用户

workgroup = MSHOME

这部分是Windows主机的工作组名,Windows主机必须在同一个工作组中

server string = %h server(Samba,Ubuntu)

这个选项是显示在Windows上的信息,可以自定义,其中%h为Samba配置文件中的变量,代表了主机名,即使用hostname命令得到的主机名

map to guest = bad user

当 security = user 时,这个选项必须注释掉,如:# map to guest = bad user

2)共享设置部分

添加一个共享文件夹设置如下:

[share]               共享文件名,不需要与实际文件名一致
comment = my share directory   对这个共享分支的描述
path = /home/share       系统的共享目录,必须为绝对路径
public = yes           是否允许所有人都能够看到此目录,no为看不到
writable = yes          是否允许用户在此目录下可写,no为不可些,如果可写,还需要目录具有写权限
read only = yes         设置用户是否只读
vaild users = username     设置只有 username 用户有效

我的配置如下:

security = user

[myshare]
  comment = my share directory
  path = /home/wwwroot/defalut
  browseable = yes
  writable = yes

新建访问共享资源的用户和设置密码

#用户创建,这个用户属于smb组
simon@Ubuntu:~$ sudo useradd admin
#设置密码
simon@Ubuntu:~$ sudo smbpasswd -a admin
New SMB password:
Retype new SMB password:
Added user admin.

启动 SAMBA 服务

#重启smb服务
sudo service smbd restart
# 停止 SAMBA 服务
sudo /etc/init.d/smbd stop
# 启动 SAMBA 服务
sudo /etc/init.d/smbd start

故障测试指令

testparm

在 WINDOWS 下访问共享目录

# 在资源管理器,或浏览器中直接输入即可, "192.168.153.155"为服务器 IP
\\192.168.153.155
#或者在"运行"窗口中输入"\\192.168.153.155"-->回车-->双击打开myshare-->回车-->输入用户名和密码-->回车-->访问成功。

二、安装SVN

root@Ubuntu:~# apt-get install subversion

建立svn仓库

#建立svn目录:
root@Ubuntu:/home# mkdir /home/svn
root@Ubuntu:/home/svn# mkdir project
#执行完毕后project目录有svnadmin创建的目录和文件
root@Ubuntu:/home/svn# svnadmin create /home/svn/project/
root@Ubuntu:/home/svn# ls ./project/
conf  db  format  hooks  locks  README.txt
root@Ubuntu:/home/svn# mkdir test
#执行完毕后test目录有svnadmin创建的目录和文件
root@Ubuntu:/home/svn# svnadmin create /home/svn/test/

上面的代码创建了2个仓库,project和test。

配置和管理svn

每个仓库的配置文件在仓库目录的conf下

1)配置svnserve.conf文件

配置项在[general]下:

anon-access:匿名用户的权限,可以为read,write和none,默认值read。不允许匿名用户访问:anon-access = none

auth-access:认证用户的权限,可以为read,write和none,默认值write。

password-db:密码数据库的路径,去掉前边的#

authz-db:认证规则库的路径,去掉前边的#。

注意:这些配置项的行都要顶格,否则会报错。修改配置后需要重启svn才能生效。

2)配置passwd文件

这是每个用户的密码文件,比较简单,就是“用户名=密码”,采用的是明码。如allen=111111

3)配置authz文件

a)[groups] section:为了便于管理,可以将一些用户放到一个组里边,比如:owner=allen,ellen

b)groups下边的sections表示对一个目录的认证规则,比如对根目录的认证规则的section为[/]。设置单用户的认证规则时一个用户一行,如:

[/]
allen=rw  //allen对根目录的权限为rw
ellen=r   //ellen对根目录的权限为r
//如果使用group,需要在group名字前加@,如
@owner=rw  //group owner中的用户均为rw,等价于上边的两句话

启动时如果从/home/svn/project启动,/就是project目录,用如上方式以project目录为根设置权限。

如果从/home/svn/启动,每个仓库根还是自己的起始目录。可以采用如上方式设置project的权限,也可以采用如下方式:

[project:/]
@owner=rw
//设置test的权限如下:
[test:/]
@harry_and_sally = rw

简言之,每个仓库的根目录(/)就是自己的起始目录;[project:/]这种方式只适用于多仓库的情况;[/]适合于单仓库和单仓库的方式。

c)不能跨越仓库设置权限。

//admin=admin,test   admin和test用户属于admin权限组
//@admin=rw    admin权限组可以read,write
admin = admin test
[project:/]
@admin = rw
* = r

启动和停止svn

1)启动

从project目录启动,根目录(/)是project,authz中规则的配置使用section[/]。

root@Ubuntu:~# svnserve -d -r /home/svn/project
#访问方式:
svn://192.168.0.87/

从svn目录启动,根目录(/)是svn,authz中对project的配置使用section[project:/] ,对test的配置使用section[test:/]。访问方式为:

root@Ubuntu:~# svnserve -d -r /home/svn
#访问方式:
svn://192.18.0.87/project
svn://192.18.0.87/test

如果需要svn自启动,把命令加入/etc/rc.local中

2)检查svn服务器是否已经启动(svn默认使用3690端口)

root@Ubuntu:/home/svn/project# netstat -an | grep 3690
tcp        0      0 0.0.0.0:3690            0.0.0.0:*               LISTEN   
#或者
root@Ubuntu:/home/svn/project# ps aux | grep svnserve

3)停止:killall svnserve或者kill -9 pid

文件存在形式

SVN在服务器端的存储方式和客户端是不一样的,所以在服务器端是看不到源文件的。服务器端有两种存储方式FSFS和BDB,目前默认都是FSFS

服务器端指令

以下是搭建简易的服务器端环境的做法,正式一般配合apache通过http访问。

1.创建版本库

创建服务器端版本库,相当于DBMS创建数据库示例。

svnadmin create file_path/repo_name

2.启动服务器

//访问该版本库的url:svn//localhost/repo_name
svnserve -d  -r file_path

客户端指令

1.初始导入(import)

//该命令可将当前路径下文件导入到版本库中。
svn import -m "init import" svn://192.168.153.155/project

报错:svn: E000013: 不能打开文件“/home/svn/project/db/txn-current-lock”: 权限不够

root@Ubuntu:~# chmod -R 777 /home/svn/

2.检出(checkout)

svn co svn://192.168.153.155/project
//或者
svn checkout svn://192.168.153.155/project

3.保持更新(update)

svn update
//或者
svn up

多人合作时:

  • 更新要经常频繁的做,尽量让问题及早暴露,便于处理。
  • 提交代码前要更新,否则容易产生版本冲突。

4.添加(add)

告知svn服务器,添加目录或文件到服务器上,这个操作类似SQL的insert,但是并没有真的操作,直到commit。

svn add file_path

5.提交改动

相当于通用概念:检入(checkin)

svn commit
//或者
svn ci

提交本地工作拷贝的所有改动,而且是原子性的,要求:一般要注明修改的原因

svn ci -m "修改bug #224"

6.还原改动

对应提交(commit),要有类似回滚(rollback)的操作。

svn revert

这个操作对开发人员十分有用,在被人改动很多代码后可以“一键恢复”。

7.“还原”已提交的改动

evert只适合未提交的情况。如果已经提交,发现问题,要回退到之前的修订版。

首先需要:

svn up

让本地工作拷贝更新到最新状态。

然后:

svn log your_file_path

查看文件日志,这时候提交时填写的说明信息就派上用场了。

查看两个修订版之间的不同:

svn diff -r 旧修订版序号:新修订版序号 your_file_path

还需要:

svn commit -m "恢复到某修订版(某修订版作废)"

这个还原是所谓的,不是用旧的版本号替代,而是将旧文件覆盖新文件。

8.拷贝文件和目录

vn copy path/file_name newpath/new_file_name
svn commit -m "xxxx"
//或者
svn cp path/file_name newpath/new_file_name
svn commit -m "xxxx"

9.重命名目录/文件

svn move file_name new_file_name
//或者
svn mv file_name new_file_name

10.处理合并冲突

svn默认不对文件加锁。

如果不同人编辑了同一个文件的不同部分,提交时会自动合并。

如果不同人编辑了同一个文件的同一部分,后提交者会报告合并冲突。

解决方法(人工仲裁):

  • 放弃改动;
  • 坚持你的改动,找到.mine的文件名,恢复为原文件名,然后执行:
svn resolved file_name

11.删除文件

将本地工作拷贝删除。

svn delete file_path
//或者
svn del file_path