facebook / fbshipit
此软件包已被废弃且不再维护。未建议替代软件包。
代码仓库同步库
v2.2.0
2023-06-07 19:46 UTC
Requires
- hhvm: ~4.80
- facebook/hh-clilib: ~2.1
- hhvm/hhvm-autoload: ~3.0
- hhvm/hsl: ~4.0
- hhvm/hsl-experimental: ~4.0
Requires (Dev)
- facebook/fbexpect: ^2.6.1
- hhvm/hacktest: ~2.0
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 许可的。