20 个版本
| 0.4.4 | 2022年12月28日 |
|---|---|
| 0.4.2 | 2020年10月20日 |
| 0.3.2 | 2020年4月27日 |
| 0.3.1 | 2020年3月29日 |
#408 在 开发工具
79 每月下载量
2.5MB
3K SLoC
git-trim

git-trim 自动修剪上游分支已合并或漂移的跟踪分支。
git-trim 是 git fetch --prune 的缺失伴侣,同时也是您 <bash oneliner HERE> 的合适、更安全、更快的替代品。
说明
屏幕录像

安装
从 发布 下载二进制文件,并将其放入您的 PATH 目录。
如果您有 cargo,也可以使用 cargo install git-trim 安装。
它底层使用 git2,在 *nix 平台上条件性地依赖于 openssl-sys。如果您从源代码构建,可能需要安装 libssl-dev 和 pkg-config 软件包。请参阅: https://docs.rs/openssl/0.10.28/openssl/#automatic
如何使用
- 别忘了为想要自动修剪的分支设置上游。以下命令
git push -u <remote> <branch>会在推送时为您设置上游。 - 如果需要在PR审查后修剪分支,请运行
git trim。它将自动识别已合并或孤立的分支并删除它们。 - 如果您不相信我,也可以使用
git trim --dry-run。
您是否在使用git-flow?
别忘了运行git config trim.bases develop,master。
您为什么要做这个?给我看看它是如何工作的。
git fetch --prune并不能为您完成所有工作。
您需要输入很多行命令,并且有很多与PR对应的分支状态。它们是否已合并或被拒绝?我是否忘记在合并后删除远程分支?
在处理仓库后,您可能会偶尔执行git fetch --prune或git remote update --prune。然而,您可能会看到本地分支的混乱,其上游在远程上已被合并和删除。因为git fetch --prune仅删除远程跟踪分支(或远程引用,refs/remotes/<remote>/<branch>),但不删除本地跟踪分支(refs/heads/<branch>)。如果远程分支已合并但维护者忘记删除,即使您知道它们已合并到master,远程跟踪分支也不会被删除,等等。

手动删除它们很麻烦。当分支进行rebase合并或squash合并时,git branch --merged可能会欺骗您。

如果没有git-trim,在PR合并或拒绝后,您可能需要手动删除它们,但这既麻烦又容易出错。
![]()
您需要像您发送的PR一样多次重复相同的命令。您必须记住刚刚关闭的PR对应的本地分支,并且很容易出错。每次我输入--force标志时,我都会感到紧张。变基合并强迫我使用--force(无意中开个玩笑)。git reflog是一个很有趣的命令,不是吗?还有git remote update和git push并不是瞬时的。当我需要输入多个命令时,即使只是等待一秒钟的提示符,我都非常讨厌。

为什么不用git fetch --prune或者git <bash oneliner HERE> | xargs git branch -D
参见常见问题解答
看看git-trim是如何工作的!
只需要输入git trim然后按一下y键即可。

哇!

这就是为什么我会制作git-trim的原因。它知道分支是否已合并到基本分支,或者是否被拒绝。即使您忘记在需要时删除远程分支,它也可以执行push --delete操作。

配置
请参阅--help或文档
常见问题解答
git fetch --prune有什么不同吗?
git fetch --prune只在远程分支被删除时删除远程跟踪分支(或远程引用,refs/remotes/...)。
问题是,它不会触及本地跟踪分支,即使上游分支已合并到基本分支并被删除。在这种情况下,您应该手动删除相应的跟踪分支。如果您使用变基合并,您可能需要使用令人恐惧的--force标志,例如git branch --delete --force。
git-trim会检测上游分支是否已合并到基本分支的上游。它知道何时可以安全地删除,并且甚至知道合并后您忘记删除远程分支。
<bash one-liner HERE> | xargs git branch -D有什么不同吗?
仅使用-D删除追踪分支,其上游已消失,这相当于--force,需要格外小心,因为它可能会删除尚未完全合并到基础分支或合并后修改的内容。并非因为--force本身危险。仅仅gone并不意味着它已经完全合并到基础分支。因此,我给它加了“激素”,变成了git-trim。
- 它检查追踪分支的上游是否已“完全”合并,而不仅仅是它们是否已消失。我大约一半的代码花在了场景测试上。我想要确保在任何情况下都不会意外删除未合并的内容。
- 它支持github流程(master-feature层分支策略)、git流程(master-develop-feature层分支策略)、简单工作流程(带有远程仓库和本地克隆)以及三角形工作流程(带有两个远程仓库和本地克隆)。
- 它对合并风格一视同仁。它可以检测常见的合并风格,如带有合并提交的合并、变基/ff合并和squash合并。
- 它还可以检查远程分支,如果忘记了,它会帮您从远程删除它们。
- 此外,它并行运行。否则,拥有数百个旧分支的大型仓库检查它们是否已合并可能需要几分钟。
git-trim支持哪些合并风格?
- 带有合并提交的经典合并,使用
git merge --no-ff - 使用
git merge --ff-only(与git cherry等价)的变基合并 - 使用
git merge --squash(使用此方法:https://stackoverflow.com/a/56026209)的squash合并
merged和stray分支之间的区别是什么?
已合并的分支是指其上游分支已完全合并到基础分支的上游,因此您不会丢失更改。
相比之下,未归类的分支是有可能丢失一些更改的分支。您的PR有时会被拒绝并从远程删除。或者,您可能错误地修改或变基了分支,并且补丁现在与已合并的补丁完全不同,因为您忘记了PR已经合并的事实。然后,由于它们的上游已删除,它们就不能盲目删除。这个术语是从git的远程跟踪状态借用的。
我甚至懒得输入git trim
尝试这个post-merge钩子。每次您在master或develop上执行git pull时,它都会自动调用git trim --no-update。建议与该钩子一起使用git config fetch.prune true。
#!/bin/bash
BRANCH=$(git rev-parse --abbrev-ref HEAD)
case "$HEAD_BRANCH" in
"master"|"develop") ;;
*) exit ;;
esac
git trim --no-update
或者尝试使用git-sync脚本。它可以在一个命令中拉取、修剪和裁剪。
trim?stray?这些术语的选择很奇怪。
我想使用prune和stale,但它们已经被占用。
免责声明
Git和Git标志是美国软件自由协会公司(Git项目的公司所在地)在美国和/或其他国家的注册商标或商标。
该标志是Git标志的派生作品。Git标志由Jason Long创作,并许可在Creative Commons Attribution 3.0 Unported License下使用。该标志使用Bitstream Charter。
心灼痛的人像是由https://gvsc.rajephon.dev生成的。
依赖关系
~17–29MB
~500K SLoC