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