2 个版本

0.1.4 2022 年 2 月 16 日
0.1.3 2021 年 10 月 2 日

#2180命令行工具

MIT/Apache

80KB
2K SLoC

Oaf,更好的 Git

Oaf 是一个 Git 客户端,它为 Git 带来了更友好的命令行界面。

它基于以下理念

  1. 合并用于将另一个分支引入的更改应用到当前分支。
  2. 分支中完成的提交与合并到分支中的提交不同。
  3. 合并是一个好事,应该被鼓励。它们通过在两组更改之间建立清晰的优先级来防止以后发生冲突。
  4. 合并可能会引入逻辑冲突,因此用户应该有机会在提交之前测试合并。
  5. 推送和拉取是同步两个相同分支副本的操作。
  6. -- 用于将选项与可能看起来像选项的输入分隔开,而不是将文件输入与其他类型的输入分隔开。
  7. 同时处理多个分支应该尽可能简单。
  8. 用户应该有机会看到将当前工作合并到最终目标将引入哪些更改。
  9. 提交从未在磁盘上存在过的代码版本通常是一个坏主意。
  10. Git 索引(暂存区/缓存)是大多数用户无用的实现细节。
  11. 历史是有价值的,通常应该保留。它允许后来的读者理解更改被引入的确切上下文。

与 Git 的不同之处

新命令

  • merge-diff 命令用于显示如果您提交并将更改合并到分支会发生什么。
  • cat 命令用于检索旧版本的文件。
  • fake-merge 假装合并一个分支,实际上不对本地内容进行任何更改。
  • squash-commit 将当前提交集转换为单个提交。
  • ignore 通过更新 .gitignore 忽略指定的文件

作为 Git 外部命令的新命令

所有新命令也可以用作 Git 外部命令,只要可以通过以 'git-' 前缀命名的名称访问 oaf 二进制文件即可。例如,通过运行以下命令 ln -s ~/.local/bin/oaf ~/.local/bin/git-merge-diff,然后你可以运行 git merge-diff。 (这假设 ~/.local/bin 已在您的路径中,并且您在那里安装了 oaf。)

行为改变的命令

  • merge 默认为 merge --no-ff --no-commit--no-commit (1.). --no-ff 是因为 mergepull 是不同的。
  • pull 使用 --ff-only (5.).
  • log 默认只显示当前分支(及其祖先)的提交。 (2.)
  • 对于尚未推送过的分支,push 将自动使用当前分支的名称推送到 origin
  • switch 允许您在不提交或显式暂存待处理更改的情况下继续工作。 (7.)
  • commit 默认为 -a (10.). 要仅提交某些更改,请考虑使用 oaf stash [-p] 临时移除不想要的更改。这为您提供了一个在提交之前测试该版本的机会 (8.).
  • diff 默认以 HEAD 作为其源 (10.). 它提供源和目标作为选项 (6.). 它默认为耐心差分,优先考虑连续匹配而非更长、分割的匹配。
  • restore 默认以 HEAD 作为其源 (10.).
  • status 使用简短格式。在确定文件是否已更改时,它(实际上)将工作树与 HEAD 进行比较 (10.).

注意:如果您只想查看新命令,而不是行为改变,请参阅上面的“将新命令用作 Git 外部命令”。

已废弃的命令

  • checkout 已被 switchrestore 取代。

未改变的命令

所有未在 oaf help 中列出的命令将自动转到 git。因此,oaf write-tree -hgit write-tree -h 相同。

扩展

因为 oaf 转接到 git,所以 oaf 也会转接到外部 git 命令。因此,也可以使用 oaf lfs 调用 git-lfs。目前,Oaf 不支持扩展的原生支持。

互操作性

文件格式兼容性

Oaf 是 Git 的前端,因此其所有对仓库的操作都是通过调用 Git 命令来执行的。它所做的一切都可以通过一系列 Git 命令来完成,这意味着一切都与 Git 完全兼容。

与其他用户的交互

使用 merge 可以提高机械互操作性,但可能会与一些 Git 用户和工具产生摩擦。大多数开发者会同意,在分支上下文中引入的更改是特殊的,但有些人不希望使用父级机制来区分分支提交和合并提交。正因为如此,他们认为所有合并都会影响可读性。

由于维护父级祖先关系不是首要任务,他们可能会通过快速前进“合并”来弄乱它,特别是 foxtrot “合并”。

请注意,使用 rebase 代替 merge 也可能影响互操作性,这是一个两难的局面,但 Git 用户已经长期接受了。

安装

Oaf 处于早期阶段,因此只提供 x86-64 的二进制文件。

它使用 Rust 语言编写,因此您需要安装 Rust 工具链才能从源代码安装。最简单的方法是:cargo install --locked oaf。这将安装最新发布的版本。

为了 Oaf 能够正常运行,必须安装 Git。Oaf 通常与 Git 2.25.x 版本一起测试。

历史

Oaf 从我的先前工作中获得了一些灵感

  • Bazaar VCS
  • bzrtools 插件
  • Fai,一个友好的 Arch 接口
  • aba,我用 shell 编写的 Arch,以添加对 Git 风格外部命令的支持。

尽管 Git 仓库格式胜过了 Bazaar,但许多来自 Bazaar 用户模型的概念可以应用于 Git。Oaf 是我尝试开始这样做的一种尝试。还有 Breezy,这是一个带有内置 Git 支持的 Bazaar 分支。

依赖项

~1.6–2.2MB
~34K SLoC