Clippy 和 rust-lang/rust
之间同步更改
Clippy 目前使用固定的 nightly 版本构建。
在 rust-lang/rust
仓库(rustc 所在之处)中,有一个 Clippy 的副本,编译器黑客会不时修改它,以适应编译器不稳定 API 的更改。
我们需要定期将这些更改同步回此仓库,同时在此期间对本仓库所做的更改也需要同步到 rust-lang/rust
仓库。
为了避免淹没 rust-lang/rust
的 PR 队列,如果没有紧急更改,这种双向同步过程会每两周进行一次。这从 Rust 稳定版发布之日开始,然后每隔一周进行。这样我们就保证了我们使这个仓库与最新的编译器 API 保持同步,并且 Clippy 中的每个功能在进入 beta 版之前,都可以在 nightly 版本中使用 2 周。作为参考,首次按照此节奏进行的同步是在 2020-08-27。
以下章节详细描述了此过程。有关 Rust 仓库中 subtree
的一般信息,请参阅rustc-dev-guide。
修补 git-subtree 以使其与大型仓库一起工作
目前,git-subtree
中存在一个错误,阻止它与 rust-lang/rust
仓库正常工作。有一个开放的 PR 来修复这个问题,但它已经过时了。在继续以下步骤之前,我们需要手动将该修复程序应用于本地 git-subtree
副本。
您可以从此处获取已修补版本的 git-subtree
。将此文件放在 /usr/lib/git-core
下(备份先前的文件),并确保它具有正确的权限
sudo cp --backup /path/to/patched/git-subtree.sh /usr/lib/git-core/git-subtree
sudo chmod --reference=/usr/lib/git-core/git-subtree~ /usr/lib/git-core/git-subtree
sudo chown --reference=/usr/lib/git-core/git-subtree~ /usr/lib/git-core/git-subtree
注意: 首次运行
git subtree push
时,必须构建缓存。这涉及到完整遍历一次 Clippy 历史记录。为此,您必须增加堆栈限制,您可以使用ulimit -s 60000
来完成。确保从调用 git subtree 的同一会话中运行ulimit
命令。
注意: 如果您是 Debian 用户,
dash
是脚本默认使用的 shell,而不是sh
。此 shell 的硬编码递归限制设置为 1,000。为了使此过程有效,您需要强制脚本运行bash
。您可以通过编辑git-subtree
脚本的第一行并将sh
更改为bash
来完成此操作。
注意:以下章节假定您已按照定义远程仓库中的说明设置了远程仓库。
执行从 rust-lang/rust
到 Clippy 的同步
以下是同步过程的 TL;DR 版本(以下所有命令都必须在 rust
目录内运行)
-
克隆
rust-lang/rust
仓库或确保它是最新的。 -
检出最新可用 nightly 的提交。您可以使用
rustup check
获取它。 -
将 Clippy 的 rust 副本的更改同步到您的 Clippy 分支
# Be sure to either use a net-new branch, e.g. `rustup`, or delete the branch beforehand # because changes cannot be fast forwarded and you have to run this command again. git subtree push -P src/tools/clippy clippy-local rustup
注意: 大多数时候,您必须在
rust-clippy
仓库中创建一个合并提交(这必须在 Clippy 仓库中完成,而不是在 Clippy 的 rust 副本中)git fetch upstream # assuming upstream is the rust-lang/rust remote git switch rustup git merge upstream/master --no-ff
注意:这是允许在 PR 中进行合并提交的少数情况之一。
-
通过运行以下命令来提升 Clippy 仓库中的 nightly 版本
cargo dev sync update_nightly git commit -m "Bump nightly version -> YYYY-MM-DD" rust-toolchain clippy_utils/README.md
-
打开一个到
rust-lang/rust-clippy
的 PR 并等待它被合并(为了加速该过程,请在您的 PR 中 ping@rust-lang/clippy
团队和/或在 Zulip 流中询问他们。)
执行从 Clippy 到 rust-lang/rust
的同步
以下所有命令都必须在 rust
目录内运行。
- 确保您已检出
rust-lang/rust
的最新master
分支。 - 将
rust-lang/rust-clippy
master 分支同步到 Clippy 的 rust 副本git switch -c clippy-subtree-update git subtree pull -P src/tools/clippy clippy-upstream master
- 打开一个到
rust-lang/rust
的 PR