4 个版本 (2 个重大更改)
0.3.0 | 2023 年 8 月 18 日 |
---|---|
0.2.0 | 2023 年 7 月 17 日 |
0.1.1 | 2023 年 5 月 10 日 |
0.1.0 | 2023 年 5 月 10 日 |
#2960 在 命令行工具
36KB
652 行
Shackle Shell
用于限制版本控制服务器访问的 shell。
这旨在替代 Git Shell,但有一些有见地的不同
- 内置了创建新仓库等额外命令。无需使用 shell 脚本扩展。
- 严格执行指定的目录结构。Git push / pull 命令仅适用于这些路径。新仓库也创建在这些路径上。
- 私有 git 仓库创建在
~/git/<username>/<reponame>.git
- 共享 git 仓库创建在
~/git/<groupname>/<reponame>.git
- 私有 git 仓库创建在
- 比 Git Shell 更好的交互式用户体验,包括
- 命令历史(仅限于当前会话)。
- Emacs 风格的快捷键(例如,
Ctrl+a
将光标移到行首)。 - 所有命令都有文档,可以在 shell 中直接访问。
- (即将推出!) 支持其他版本控制系统。
入门
用法
Shackle Shell 旨在作为 git 服务器上用户默认 shell 设置,用户通过 SSH 连接(请参阅下面的安装部分)。
当您通过 SSH 登录时,您将看到一个提示,准备好您输入命令。
>
您可以通过运行 help
命令来查看内置的帮助。
> help
Usage: <COMMAND>
Commands:
init Create a new repository
list List all repositories available
set-description Sets the description of a repository, as shown in the CLI listing and web interfaces
set-branch Sets the main branch of the repository
exit Quit the shell
git-upload-pack Server side command required to git fetch from the server
git-receive-pack Server side command required by git push to the server
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
init
命令用于创建新仓库。在其最简单的形式中,您只需提供新仓库的名称。这将创建一个具有个人所有权的 git 仓库。
> init awesome-project-idea
Successfully created "git/shukkie/awesome-project-idea.git"
这里提供的路径是相对于您的主目录。因此,克隆此仓库的完整 URL 是 <username>@<server domain>:<git path>
git clone [email protected]:git/shukkie/awesome-project-idea.git
您可以通过使用 --help
标志来了解其高级选项。这适用于所有选项,并且是了解所有命令如何工作的好方法。
> init --help
Create a new repository
Usage: init [OPTIONS] <REPO_NAME>
Arguments:
<REPO_NAME> Name of the new repository
Options:
--group <GROUP> Share repository ownership with the specified group (user must be a member of the group)
--description <DESCRIPTION> Sets the description of the repository, as shown in the CLI listing and web interfaces
--branch <BRANCH> Sets the main branch of the repository [default: main]
-h, --help Print help
安装
背景
挂钩设计用于在Git服务器上运行。设置自己的Git服务器的过程,如下两篇文章所述:
先决条件
以下程序必须安装:
- Git
- 这用于git操作,通过
git push
和git fetch
执行。 - Git必须安装,且
git-upload-pack
和git-receive-pack
可执行文件必须在路径中。
- 这用于git操作,通过
- SSH
- 我假设用户将通过SSH连接。这并非由shell强制执行,但这是我在意的主要用例。我使用OpenSSH守护进程进行了测试。
构建Shackle
可以从Codeberg下载Shackle的二进制发布版。
您也可以从源代码构建它。最简单的方法是使用cargo install
。
这需要Rust工具链和C编译器。有关从源代码构建的环境设置信息,请参阅下面的开发环境设置部分。
# This installs to Cargo's default, which is ~/.cargo/bin. Consider using the
# --root option to install it somewhere that makes more sense for your server.
cargo install shackle-shell
创建所需的目录结构
接下来,Shackle期望一个特定的目录结构。具体来说,个人Git仓库将位于~/git/your-username
,共享仓库将位于~/git/your-group
。如果您创建了一个需要这些组目录之一的仓库,并且它尚未存在,Shackle将创建它。
如果您在服务器上有许多用户,那么请考虑将~/git
作为实际Git仓库共享位置的符号链接。例如,在我的仓库中,所有Git用户的主目录中都有一个指向/srv/git
的~/git
符号链接。
mkdir -p ~/git/$USER
chmod --recursive u=rwX,g=,o= ~/git/$USER
# Note that this should be a group you're actually a member of!
GROUP=my-group
mkdir -p ~/git/$GROUP
chown --recursive $USER:$GROUP ~/git/$GROUP
chmod --recursive u=rwX,g=rwXs,o= ~/git/$GROUP
将Shackle设置为默认shell
下一步是将用户的默认shell设置为Shackle。这意味着如果您以用户身份登录,例如通过ssh,则默认shell将是Shackle。
sudo usermod --shell $HOME/.cargo/bin/shackle-shell $USER
操作系统支持
目前,Shackle Shell仅支持在Linux上运行。
它可能在其他类Unix平台上也能工作,如MacOS,但这尚未经过测试,目前也没有计划进行测试。我不期望它在Windows上工作。
发布
有关发布说明,请参阅CHANGELOG.md。
报告问题
请在项目的问题跟踪器中报告任何问题。
路线图
计划的功能记录在项目的问题跟踪器中,带有"增强"标签。
总体计划是
- 修复出现的任何错误。
- 添加更多用于配置仓库的命令。
- 添加更多对仓库进行操作的命令,例如移动它们或执行清理任务。
- 添加对其他版本控制系统的支持。
贡献
有关设置开发环境以进行更改和提交贡献的说明,请参阅CONTRIBUTING.md。
支持
如果您从这个项目中获得了价值,请考虑在Patreon上支持我。通过Patreon的支持可以帮助支付托管费用、购买电脑设备,并让我有更多时间撰写文章和开源软件。
许可证
版权所有 2023,Justin Wernick。
许可协议为以下之一
- Apache License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可协议 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
您可自行选择。
除非您明确表示否则,根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,都将如上所述双许可,不附加任何额外条款或条件。
依赖项
~15MB
~342K SLoC