一、搭建 Git 服务器并通过 Samba 共享
这种方式下,Git 服务器本身处理版本控制逻辑,Samba 只负责共享 Git 仓库所在的目录。
1. 安装 Git 和 Samba
1 | sudo apt update |
2. 创建 Git 仓库
-
创建一个用于存放 Git 仓库的目录(例如
/srv/git
):1
sudo mkdir -p /srv/git
-
进入该目录并初始化一个裸仓库(bare repository):
1
2cd /srv/git
sudo git init --bare myproject.git # "myproject" 是你的项目名称裸仓库只包含版本控制信息,没有工作目录。
-
设置权限
1
2sudo chown -R www-data:www-data /srv/git/myproject.git #假设你的samba用户是www-data
sudo chmod -R 775 /srv/git/myproject.git
3. 配置 Samba 共享
-
编辑 Samba 配置文件:
1
sudo vim /etc/samba/smb.conf
-
在文件末尾添加以下内容(根据你的实际情况修改):
1
2
3
4
5
6
7
8
9
10[git-repos]
comment = Git Repositories
path = /srv/git
browseable = yes
read only = no
guest ok = no # 如果需要匿名访问,设置为 yes
valid users = @gitusers # 允许访问的用户组 (见下一步)
create mask = 0664
directory mask = 0775
force group = gitusers #强制组[git-repos]
: 共享名称,客户端访问时使用。path
: Git 仓库所在的目录。valid users
: 允许访问的用户或用户组(需要先创建用户/组)。guest ok
: 是否允许匿名访问(不推荐)。
-
创建一个 Samba 用户组(例如
gitusers
)并将用户添加到该组:1
2
3sudo groupadd gitusers
sudo usermod -aG gitusers nas
sudo smbpasswd -a nas重复
usermod
和smbpasswd
命令,添加多个用户。 -
重启 Samba 服务:
1
sudo systemctl restart smbd
4. 客户端访问
-
在 Windows 上:
- 打开文件资源管理器,在地址栏输入
\\your_server_ip\git-repos
(将your_server_ip
替换为你的服务器 IP 地址或主机名)。 - 输入你的 Samba 用户名和密码。
- 你应该能看到
myproject.git
目录。
- 打开文件资源管理器,在地址栏输入
-
在 Linux/macOS 上:
- 可以使用命令行或图形界面的 SMB/CIFS 客户端访问。
- 挂载 Samba 共享:(将
1
sudo mount -t cifs //your_server_ip/git-repos /mnt/git -o username=yourusername,password=yourpassword
/mnt/git
替换为你想要挂载到的本地目录)。
-
使用 Git 客户端克隆仓库:
1
2
3git clone smb://your_server_ip/git-repos/myproject.git
# 或者, 如果已经挂载:
git clone /mnt/git/myproject.git之后就可以像使用普通的 Git 仓库一样进行
add
、commit
、push
、pull
等操作。
二、搭建 SVN 服务器并通过 Samba 共享
与 Git 类似,SVN 服务器处理版本控制,Samba 共享 SVN 仓库目录。
1. 安装 SVN 和 Samba
1 | sudo apt update |
libapache2-mod-svn
提供了通过 Apache 进行 SVN 访问的功能 (可选, 但更安全, 推荐)
2. 创建 SVN 仓库
-
创建一个用于存放 SVN 仓库的目录(例如
/srv/svn
):1
sudo mkdir -p /srv/svn
-
进入该目录并创建一个 SVN 仓库:
1
2cd /srv/svn
sudo svnadmin create myproject # "myproject" 是你的项目名称 -
设置权限
1 | sudo chown -R www-data:www-data /srv/svn/myproject |
3. (可选, 推荐) 配置 Apache + SVN (更安全)
-
创建 SVN 的密码文件:
1
2sudo htpasswd -c /etc/apache2/dav_svn.passwd yourusername # 创建第一个用户
sudo htpasswd /etc/apache2/dav_svn.passwd anotheruser # 添加更多用户 -
创建一个 Apache 配置文件:
1
sudo nano /etc/apache2/mods-available/dav_svn.conf
添加以下内容:
1
2
3
4
5
6
7
8<Location /svn>
DAV svn
SVNParentPath /srv/svn
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
</Location> -
启用必要的 Apache 模块并重启 Apache:
1
2
3sudo a2enmod dav
sudo a2enmod dav_svn
sudo systemctl restart apache2- 现在, 可以通过
http://your_server_ip/svn/myproject
来访问 SVN 仓库 (需要用户名和密码).
- 现在, 可以通过
4. 配置 Samba 共享 (如果不用 Apache, 可以通过 Samba 共享)
-
编辑 Samba 配置文件:
1
sudo nano /etc/samba/smb.conf
-
在文件末尾添加以下内容:
1
2
3
4
5
6
7
8
9
10[svn-repos]
comment = SVN Repositories
path = /srv/svn
browseable = yes
read only = no
guest ok = no # 如果需要匿名访问,设置为 yes
valid users = @svnusers #同上,需要创建svnusers组和用户
create mask = 0664
directory mask = 0775
force group = svnusers -
创建 Samba 用户组和用户 (参考 Git 部分的步骤)。
-
重启 Samba 服务:
1
sudo systemctl restart smbd
5. 客户端访问
- 如果使用 Apache + SVN, 使用 SVN 客户端通过
http://your_server_ip/svn/myproject
访问. - 如果使用 Samba 共享:
- Windows:
\\your_server_ip\svn-repos
- Linux/macOS:
smb://your_server_ip/svn-repos
(或挂载) - 使用 SVN 客户端(如 TortoiseSVN、
svn
命令行工具)进行checkout
、commit
、update
等操作。
- Windows:
smb 启用回收站
Samba 的 vfs_recycle
模块提供了一个简单但实用的回收站功能,可以防止用户意外删除共享文件。当用户通过 Samba 删除文件时,文件不会被立即从服务器上永久删除,而是会被移动到一个特殊的回收站目录中。管理员可以配置回收站的保留策略,例如文件保留时间、回收站最大容量等。
下面是关于 vfs_recycle
模块的详细说明和配置方法:
1. 工作原理
- 当用户通过 Samba 客户端删除文件时,
vfs_recycle
模块会拦截删除操作。 - 文件不会被真正删除,而是被移动到预先配置好的回收站目录中。
- 移动到回收站的文件会保留一段时间(可配置),超过保留时间后才会被自动删除。
- 管理员可以手动清理回收站,或者恢复回收站中的文件。
2. 配置方法
vfs_recycle
模块的配置主要在 Samba 的配置文件 (/etc/samba/smb.conf
) 中完成。你可以在全局配置部分 ([global]
) 中设置默认的回收站参数,也可以在单个共享配置部分中为特定的共享设置不同的回收站参数。
以下是一个配置示例,添加到你的 smb.conf
文件中:
1 | [global] |
参数说明:
vfs objects = recycle
: 启用vfs_recycle
模块。可以放在[global]
部分(对所有共享生效)或单个共享配置部分(只对该共享生效)。recycle:repository = .recycle/%U
:- 指定回收站目录的位置。
.recycle
是回收站目录的名称(可以自定义)。%U
是一个变量,代表删除文件的用户名,这样可以为每个用户创建单独的回收站。- 也可以使用绝对路径,例如
/path/to/recycle/%U
。 - 如果使用相对路径(如
.recycle
),回收站目录会创建在共享目录的根目录下。
recycle:keeptree = Yes
: 在回收站中保留文件被删除前的原始目录结构。如果设置为No
,所有文件都会被直接放在回收站根目录下。recycle:versions = Yes
:- 如果回收站中已经存在同名文件,是否创建新版本。
- 设置为
Yes
时,新版本的文件名会附加一个版本号(例如file.txt.1
、file.txt.2
)。 - 设置为
No
时,新文件会覆盖旧文件。
recycle:touch = Yes
: 当文件被移动到回收站时,更新文件的访问时间(atime)。recycle:maxsize = 0
:- 设置回收站的最大容量(以字节为单位)。
0
表示无限制。- 当回收站达到最大容量时,最早的文件会被自动删除。
recycle:exclude = *.tmp, *.temp
: 指定不放入回收站的文件类型(使用通配符)。recycle:exclude_dir = /tmp, /cache
: 指定不放入回收站的目录(绝对路径)。recycle:noversions = *.doc
: 指定不保留版本的文件类型(即使recycle:versions = Yes
)。recycle:minsize = 1024
: 指定只有大于此大小(字节)的文件才会被放入回收站。recycle:days_kept = 30
: 指定文件在回收站中保留的天数。超过此天数的文件会被自动删除。
3. 注意事项
- 权限: 确保 Samba 用户对回收站目录有读写权限。
- 性能: 如果回收站中文件过多,可能会影响 Samba 的性能。建议定期清理回收站。
- 删除: 回收站中的文件,是真正被删除。
- 与版本控制的区别:
vfs_recycle
模块只是一个简单的回收站功能,它不能像 Git、SVN 那样进行细粒度的版本控制(记录每次修改、回滚到特定版本等)。它只能恢复被删除的文件,而不能恢复文件的历史版本(除非启用了recycle:versions
并且文件名相同)。 - 客户端兼容性: 通过smb删除的文件才会进入回收站,直接在服务器上通过
rm
等命令删除,不会进入回收站。
4. 使用方法
配置完成后,用户通过 Samba 客户端删除文件时,文件会自动进入回收站。管理员可以通过以下方式管理回收站:
- 直接访问回收站目录: 回收站目录通常位于共享目录的根目录下(如果使用相对路径)或指定的绝对路径下。管理员可以直接访问该目录来查看、恢复或删除回收站中的文件。
- 使用命令行工具: 可以编写脚本,定期清理回收站中超过保留时间的文件。
通过合理配置 vfs_recycle
模块,你可以为 Samba 共享提供一个简单有效的回收站功能,防止用户误删除文件,提高数据安全性。