facebook/fbshipit

此软件包已被废弃且不再维护。未建议替代软件包。

代码仓库同步库

安装: 5,171

依赖项: 0

建议者: 0

安全性: 0

星标: 387

关注者: 47

分支: 121

公开问题: 10

语言:Hack

v2.2.0 2023-06-07 19:46 UTC

This package is auto-updated.

Last update: 2023-06-07 19:49:27 UTC


README

注意:该项目不再维护。Meta 已经转向使用一个(目前)闭源解决方案,我们希望在未来发布。现有的开源用户可以查看 Copybara

FBShipIt 是用 Hack 编写的库,用于从一个仓库复制提交到另一个仓库。

例如,Meta 使用它来

  • 从我们的单体 Mercurial 仓库复制提交到特定项目的 GitHub 仓库
  • 同步 CPython 和 Linux 内核等特定项目仓库的更改
  • 将 PyTorch 的更改导入我们的 Mercurial 单一仓库

主要功能

  • 从 Git 或 Mercurial (hg) 仓库中读取
  • 写入 Git 或 Mercurial (hg) 仓库
  • 删除匹配特定模式的文件或目录
  • 删除/重写提交消息的部分
  • 修改提交作者(例如,如果所有内部提交都是由员工编写的,则对于 GitHub 拉取请求恢复原始作者)

主要限制

FBShipIt 主要为具有线性历史的分支设计;特别是,它不理解合并提交。

要求

安装

$ composer require facebook/fbshipit

FBShipIt 的工作方式

有三个主要概念:阶段、更改集和过滤器。

ShipItPhase 对象表示一个高级操作,例如 '克隆此仓库'、'拉取此仓库'、'同步更改集' 和 '推送仓库'。

在同步阶段中,ShipItChangeset 是一个不可变对象,表示一个提交。

过滤器是函数,它接受一个更改集,并返回一个新的、修改后的更改集。

提供的阶段

  • ShipItCreateNewRepoPhase:创建一个新的 Git 仓库,带有 '初始提交'。除非传递了 --create-new-repo,否则会跳过。
  • ShipItAssertValidFilterPhase:确保过滤器与指定的根目录一致。
  • ShipItGitHubInitPhase:创建和配置一个 GitHub 克隆。
  • ShipItPullPhase:将任何新更改拉入仓库。
  • ShipItPushPhase:将本地更改推送到目标仓库。
  • ShipItSyncPhase:从源仓库复制提交到目标仓库。
  • ShipItVerifyRepoPhase:检查目标仓库是否与源仓库和过滤器匹配。除非传递了 --verify--create-fixup-patch,否则会跳过。

使用 FBShipIt

您需要构造

  • 一个 ShipItManifest 对象,定义您的默认工作目录以及源和目标仓库的目录名称
  • 您想要运行的阶段列表
  • 一个过滤器管道,假设您正在使用 ShipItSyncPhase

提供了用于常见操作的过滤器 - 最常见的是

  • ShipItPathFilters::moveDirectories(string $changeset, dict<string, string> $mapping):将补丁应用到目标仓库的不同目录
  • ShipItPathFilters::stripPaths(string $changeset, vec<string> $patterns, vec<string> $exception_patterns = vec[]):移除匹配 $patterns 的路径的所有修改,除非它们匹配 $exception_patterns 中的某个项。

示例

查看 demo/ 目录以获取一个简单的入门示例。

与空目标仓库一起使用

ShipItCreateNewRepoPhase 添加到您的阶段列表中(在源初始化和拉取阶段之后),然后运行

hhvm my_script.hack --create-new-repo

这将为您提供包含单个提交的 git 仓库的路径;然后您可以将其推送到您的目标位置。

与现有目标仓库一起使用

当源仓库中至少有一个相关提交不在目标仓库中时,运行

hhvm my_script.hack --first-commit=FIRST_UNSYNCED_COMMIT_ID_GOES_HERE

未来的运行

不带参数运行您的脚本;FBShipIt 会为其创建的提交添加跟踪信息,因此将自动同步任何新提交。

使用多个项目减少通用代码

我们建议将通用过滤器阶段设置拆分到单独的类中,并在项目之间重用这些类。有关 Facebook 用法的示例,请参阅 FBCommonFilters

其他示例

一些可能对配置 FBShipIt 有用的其他代码可以在 fb-examples/ 中找到。

许可证

FBShipIt 是 MIT 许可的。