Revup提供命令行工具,使开发者能够更快地迭代并行更改,并减少创建和维护代码审查的开销。
特性
- Revup在后台为您创建多个独立的分支链,而不会触及您的工作树。然后,它为所有这些分支创建和管理GitHub拉取请求。
- 拉取请求针对实际的基础分支,可以手动合并或通过持续集成合并。
- 变基检测通过不重新推送未更改的补丁来节省时间和持续集成成本。
- 从提交文本中添加审阅者、标签,并创建草稿。
- 添加自动更新的"审阅图"和"补丁集"元素,使拉取请求更易于导航。
revup amend
和revup restack
通过替换缓慢的变基来节省时间。
兼容性
Revup需要Python 3.8或更高版本以及Git 2.43或更高版本。Revup适用于Linux、OSX和Windows(有限测试)。
按照这里的说明获取适用于您操作系统的最新Git版本。Revup使用仅在较新Git版本中存在的标志。
安装
使用pip
或您喜欢的包管理器进行安装。
python3.8 -m pip install revup
通过显示帮助页面验证安装是否成功。
revup -h
您也可以从源代码构建以获取最新更新。
git clone https://github.com/Skydio/revup.git && cd revup
make deps && make package && make install
教程
本教程将指导您使用基本的revup功能。
首次设置
通过复刻 revup、创建新的仓库,或使用您拥有的其他仓库来克隆一个沙盒仓库。 创建测试PR可能会产生垃圾信息,所以不要在他人的仓库上进行教程。
git clone https://github.com/<your-name>/revup.git && cd revup
首次运行时,您需要配置GitHub凭证。在这里创建一个个人访问令牌, 并勾选"完整仓库权限"的复选框。Revup需要这个权限来创建和修改拉取请求。然后运行
revup config github_oauth
并将oauth复制粘贴到提示中。
创建独立的拉取请求
创建您的前两个提交,这将成为两个独立的拉取请求。 注意提交消息中的"Topic:"标签 - 这是revup识别和处理提交的方式。 每个单独命名的主题都将成为一个新的拉取请求。
echo meh > foo; git add foo
git commit -m "My first revup foo" -m "Topic: foo"
echo peh > bar; git add bar
git commit -m "My first revup bar" -m "Topic: bar"
revup upload
您已上传了您的第一个revup更改!注意在GitHub中,两个分支都针对"main"。这允许它们独立合并。
在底层,revup为您创建并推送这些分支,根据需要跟踪和管理依赖关系。
创建相对拉取请求
现在我们将创建一个相对于"foo"的新审阅。"Relative"标签将确保新审阅针对正确的分支。
echo deh >> foo; git add foo
git commit -m "My second revup foo" -m "Topic: foo2" -m "Relative: foo"
revup upload
使用这个简单而强大的模型,您可以一次性上传独立和相关的更改。
- 多个提交可以在一个主题中,在这种情况下,它们都将在一个拉取请求中。
- 同一主题中的提交不需要在历史记录中相邻。
- 相互关联的主题不需要在历史记录中相邻,但第二个主题必须在第一个之后。
修改拉取请求
现在让我们更新一个拉取请求。
echo heh >> bar; git add bar
# 要么
revup amend HEAD~ --no-edit # 指定要修改的提交
# 或者
revup amend bar --no-edit # 指定要修改的主题名称
revup upload
revup amend
使修改历史记录中的提交变得容易。您还有其他选择来修改审阅:
- 添加具有相同主题的新提交
- 使用
git rebase --interactive
和git commit --amend
引入上游更改
使用git pull --rebase
来引入更改。不要使用不带rebase的git merge
或git pull
,因为这会创建一个合并提交。
默认情况下,如果您拉取但未对提交进行更改,revup将不会上传。要覆盖此设置并始终上传,请运行revup upload --rebase
。
[pull]
rebase = true
[rebase]
autoStash = true
我们建议将上述内容添加到.gitconfig
中,以使拉取和变基更容易。
更多功能
这是一些更方便的revup功能的非详尽介绍。
有关功能的完整描述,请参阅文档或运行revup -h
或revup upload -h
以man
格式查看文档。
使用复刻
对于您可能没有推送权限的项目贡献,可以配置revup推送到复刻,同时在主项目中创建拉取请求。
为原始仓库和复刻添加git远程。
$ git remote -v
origin https://github.com/ORIGINAL_OWNER/REPO_NAME.git (fetch)
origin https://github.com/ORIGINAL_OWNER/REPO_NAME.git (push)
myfork https://github.com/YOUR_USERNAME/REPO_NAME.git (fetch)
myfork https://github.com/YOUR_USERNAME/REPO_NAME.git (push)
上传时,将创建拉取请求的远程作为--remote-name
传递,将复刻的远程作为--fork-name
传递。
revup --remote-name origin --fork-name myfork upload
添加审阅者/标签
Revup还可以为拉取请求添加审阅者、受理人和标签。在主题的任何提交中添加适当的标签。
Reviewers: alice, bob
Assignees: eve
Labels: bug, feature, draft
GitHub用户名可以缩写,将匹配给定前缀的最短名称。
标签必须完全匹配。draft
标签是特殊的,如果存在则会将拉取请求设为草稿,如果移除则会取消草稿状态。
在其他分支上工作
Revup通常会自动检测你的本地基础分支,并使用它来列出提交和目标审核。 你可以选择将任何特定主题指向另一个分支,甚至多个分支,这种情况下revup会将它们作为基础分支(在后一种情况下会创建多个拉取请求)。
针对多个分支的修复
主题:修复
分支:main, rel1.1
你也可以在命令行中指定基础分支,尽管这通常没有必要,除非你正在处理自动检测器不知道的分支(请参阅下面的仓库配置)。
revup upload --base-branch custom-branch-name
审核图和补丁集
Revup会在每个拉取请求中添加两条评论,为用户和审核者提供有用的功能。这些默认启用,并随着拉取请求的变化自动更新。
审核图提供了与当前拉取请求有相对关系的所有本地拉取请求的链接和标题,包括它所依赖的或依赖它的请求。这允许你快速浏览链式拉取请求。
补丁集表格提供了给定拉取请求的上传历史,以及每次上传之间差异的链接和摘要。值得注意的是,revup特别处理了重新基础(rebase)然后上传的情况,会显示一个不包含上游文件的差异。
配置revup
Revup可以使用标准配置文件格式进行高度定制。每个标志也是一个配置选项,因此用户可以获得他们需要的确切行为。
命令行上指定的标志优先级最高,其次是~/.revupconfig
中的配置,再次是当前仓库中的.revupconfig
。
仓库配置
仓库内配置文件的主要用途是设置主分支和发布分支的命名。
例如,如果你的主分支是master
,发布分支命名如rel1.1
,请在仓库根目录的.revupconfig
中提交以下内容。
[revup]
main_branch = master
base_branch_globs =
rel[1-9].[0-9]
rel[1-9].[0-9][0-9]
用户配置
位于~/.revupconfig
的用户配置通过默认设置最常用的标志来节省时间。
例如,在熟悉工作流程后,用户可能不需要确认检查。添加以下行相当于使用--skip-confirm
运行。
[upload]
skip_confirm = True
附录
基于提交的开发
(又称"堆叠差异"、"基于补丁"等)
如果你使用过Gerrit、Phabricator或git邮件列表等工具,你可能已经熟悉这种开发风格。如果你想了解更多,这里有一些关于这个主题的精心撰写的讨论。
同类项目
Revup的灵感部分来自这个非详尽的开源项目列表,这些项目也支持基于补丁的工作流:
- ghstack:同样是与github集成的基于补丁的工具。revup基于这个项目的代码构建,特别是graphql的使用。
- git-branchstack:创建类似于
revup upload
的分支,但不推送或创建审核。 - git-revise:类似于
revup amend
,是上述工具的后端,具有处理冲突的合并系统。
贡献与支持
感谢你为revup做出贡献!你可以从自己的想法开始,或者查看问题页面,了解其他人感兴趣的想法。
报告问题时:
- 检查问题跟踪器,看是否已经有人报告过。
- 提供重现步骤的描述。
- 如果可能,使用
revup -v
运行相同的命令,提供详细日志。
免责声明
Revup由Skydio发布,但不是Skydio的官方支持产品。