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命令行工具

MIT/Apache

36KB
652

Shackle Shell

status-badge crates.io

用于限制版本控制服务器访问的 shell。

这旨在替代 Git Shell,但有一些有见地的不同

  • 内置了创建新仓库等额外命令。无需使用 shell 脚本扩展。
  • 严格执行指定的目录结构。Git push / pull 命令仅适用于这些路径。新仓库也创建在这些路径上。
    • 私有 git 仓库创建在 ~/git/<username>/<reponame>.git
    • 共享 git 仓库创建在 ~/git/<groupname>/<reponame>.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 pushgit fetch执行。
    • Git必须安装,且git-upload-packgit-receive-pack可执行文件必须在路径中。
  • 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

发布版本也可在Crates.ioCodeberg上找到。

报告问题

请在项目的问题跟踪器中报告任何问题。

路线图

计划的功能记录在项目的问题跟踪器中,带有"增强"标签

总体计划是

  • 修复出现的任何错误。
  • 添加更多用于配置仓库的命令。
  • 添加更多对仓库进行操作的命令,例如移动它们或执行清理任务。
  • 添加对其他版本控制系统的支持。

贡献

有关设置开发环境以进行更改和提交贡献的说明,请参阅CONTRIBUTING.md

支持

如果您从这个项目中获得了价值,请考虑在Patreon上支持我。通过Patreon的支持可以帮助支付托管费用、购买电脑设备,并让我有更多时间撰写文章和开源软件。

许可证

版权所有 2023,Justin Wernick。

许可协议为以下之一

您可自行选择。

除非您明确表示否则,根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,都将如上所述双许可,不附加任何额外条款或条件。

依赖项

~15MB
~342K SLoC