1 个稳定版本

1.0.0 2022年12月29日

#2952 in 命令行工具

MIT 许可证

54KB
924

ripit

ripit 是一个可执行文件,它自动化两个 git 仓库之间提交的复制。其主要目的是在能够控制公开内容的同时发布仓库。例如

  • 仅在给定的提交之后发布,以保持之前的历史私有。
  • 从提交信息中删除特定标签(例如,引用内部工单的标签)。
  • 删除提交的作者以保持匿名(尚未开发)。

尽可能保持仓库的结构。特别是,如果可能,正确地复制合并提交(有关详细信息,请参阅uprooting)。

安装

ripit 使用 Rust 编写并使用 cargo。要构建它,只需执行以下操作:

$ cargo build --release
$ cargo install --path .

ripit 需要 Rust 2018,因此 rust / cargo 的版本应大于 1.31。

使用

ripit 在本地仓库(公共仓库)内部运行,从远程(私有仓库)复制提交。

要使用 ripit,必须首先创建一个配置文件。完整的模板在 config-template.yml 中可用,以下是一个示例

path: /path/to/the/local/repo
remote: private
branches:
  - v1
  - master

初始化

然后,必须首先创建引导提交,这将使用每个要同步的分支的 private/{branch} 分支的状态初始化本地仓库的单个提交。

$ mkdir /path/to/the/local/repo && cd /path/to/the/local/repo
$ git init
$ git remote add private <...>
$ ripit --bootstrap config.yml
Fetch branch v1 in remote private...
Fetch branch master in remote private...
Bootstrap commit 0573aafd79531c93c4149cc8a10dad54c800ca7a created for branch v1.
Bootstrap commit 06b6e5cb76a80250a033cade1eed7d38e84ab3e4 created for branch master.

同步

然后,运行 ripit 将从远程分支复制所有新提交到本地仓库。这意味着所有在引导之前在私有仓库中提交的提交都将被隐藏,并且只会将新提交复制到本地仓库。

$ ripit config.yml
Fetch branch v1 in remote private...
Fetch branch master in remote private...
Found ripit tag, last synced commit was fe81a4739b7817304eb0fa1bf5719b05e324ba21.
Nothing to synchronize on branch v1, already up to date with private.
Commits to synchronize on master:
  Commit f1350c8c737c3d2a462956b73f8e5befd021321a
    Johnny Joestar <[email protected]>
    add new spin feature

  Commit 19fc6a5690d8c56ecbe26b45508a0f939dedbbf7
    Gyro Zeppeli <[email protected]>
    introduce mozarella easter egg

Is this ok? [yN] y
Copying commit f1350c8c737c3d2a462956b73f8e5befd021321a...
Created commit a03ccdee76289dd52c8f79442588084f0fcab9d6.
Copying commit 19fc6a5690d8c56ecbe26b45508a0f939dedbbf7...
Created commit 343178000ab4ee6d207787ccb44e79766689c0e1.

将显示提示以允许检查即将同步的提交是否可以复制。同步后,不会自动推送提交,由调用者确保复制有效,并且新提交可以推送。

每个提交都包含一个 tag,它用于将复制的提交与原始提交映射

$ git show
commit 343178000ab4ee6d207787ccb44e79766689c0e1
Author: Gyro Zeppeli <[email protected]>
Date:   Fri Aug 16 14:11:36 2019 +0200

    introduce mozarella easter egg

    rip-it: 19fc6a5690d8c56ecbe26b45508a0f939dedbbf7

uprooting

在某些情况下,无法正确复制提交,同步将被拒绝。当尝试复制一个包含先于引导的祖先的合并提交时,可能会发生这种情况。为了处理这种情况,ripit 允许在本地分支上选择那些提交,这个过程称为 uprooting

Remote situation

远程情况,引导在 C1 上完成

Local situation

本地情况,提交 C2 和 C3 已被 uprooted

此操作不会保留存储库的拓扑结构,因为本地仓库中的这些提交将具有与原始提交不同的父提交。默认情况下不会激活此行为以防止错误,因为只有当部分远程仓库被bootstrapping隐藏时,才会出现这种情况。必须使用-u标志。

此外,由于不保留拓扑结构,在复制这些提交时可能会发生冲突。在这些情况下,用户需要解决冲突,并继续同步。

许可协议

此存储库是从为Intersec编写的原始版本派生的。

感谢GitGraphJs提供git图形生成

依赖项

~16MB
~363K SLoC