#git-branch #branch #git-remote #git #trim #prune #git-config

bin+lib git-trim

自动修剪跟踪分支,其中上游分支已合并或漂移

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开发工具

Download history 8/week @ 2024-03-08 4/week @ 2024-03-15 145/week @ 2024-03-29 31/week @ 2024-04-05 4/week @ 2024-04-12 1/week @ 2024-04-19

79 每月下载量

MIT 许可证

2.5MB
3K SLoC

CI crates.io

git-trim

git-trim Logo

git-trim 自动修剪上游分支已合并或漂移的跟踪分支。

git-trimgit fetch --prune 的缺失伴侣,同时也是您 <bash oneliner HERE> 的合适、更安全、更快的替代品。

说明 | 配置 | 常见问题解答

说明

屏幕录像

git-trim screencast

安装

发布 下载二进制文件,并将其放入您的 PATH 目录。

如果您有 cargo,也可以使用 cargo install git-trim 安装。

它底层使用 git2,在 *nix 平台上条件性地依赖于 openssl-sys。如果您从源代码构建,可能需要安装 libssl-devpkg-config 软件包。请参阅: https://docs.rs/openssl/0.10.28/openssl/#automatic

如何使用

  1. 别忘了为想要自动修剪的分支设置上游。以下命令git push -u <remote> <branch>会在推送时为您设置上游。
  2. 如果需要在PR审查后修剪分支,请运行git trim。它将自动识别已合并或孤立的分支并删除它们。
  3. 如果您不相信我,也可以使用git trim --dry-run

您是否在使用git-flow?

别忘了运行git config trim.bases develop,master

您为什么要做这个?给我看看它是如何工作的。

git fetch --prune并不能为您完成所有工作。

您需要输入很多行命令,并且有很多与PR对应的分支状态。它们是否已合并或被拒绝?我是否忘记在合并后删除远程分支?

在处理仓库后,您可能会偶尔执行git fetch --prunegit remote update --prune。然而,您可能会看到本地分支的混乱,其上游在远程上已被合并和删除。因为git fetch --prune仅删除远程跟踪分支(或远程引用,refs/remotes/<remote>/<branch>),但不删除本地跟踪分支(refs/heads/<branch>)。如果远程分支已合并但维护者忘记删除,即使您知道它们已合并到master,远程跟踪分支也不会被删除,等等。

before

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

git branch --merged doesn't help

如果没有git-trim,在PR合并或拒绝后,您可能需要手动删除它们,但这既麻烦又容易出错。

old way of deleting them

您需要像您发送的PR一样多次重复相同的命令。您必须记住刚刚关闭的PR对应的本地分支,并且很容易出错。每次我输入--force标志时,我都会感到紧张。变基合并强迫我使用--force(无意中开个玩笑)。git reflog是一个很有趣的命令,不是吗?还有git remote updategit push并不是瞬时的。当我需要输入多个命令时,即使只是等待一秒钟的提示符,我都非常讨厌。

gvsc before

为什么不用git fetch --prune或者git <bash oneliner HERE> | xargs git branch -D

参见常见问题解答

看看git-trim是如何工作的!

只需要输入git trim然后按一下y键即可。

git trim

哇!

after

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

gvsc after

配置

请参阅--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合并

mergedstray分支之间的区别是什么?

已合并的分支是指其上游分支已完全合并到基础分支的上游,因此您不会丢失更改。

相比之下,未归类的分支是有可能丢失一些更改的分支。您的PR有时会被拒绝并从远程删除。或者,您可能错误地修改或变基了分支,并且补丁现在与已合并的补丁完全不同,因为您忘记了PR已经合并的事实。然后,由于它们的上游已删除,它们就不能盲目删除。这个术语是从git的远程跟踪状态借用的。

我甚至懒得输入git trim

尝试这个post-merge钩子。每次您在masterdevelop上执行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脚本。它可以在一个命令中拉取、修剪和裁剪。

trimstray?这些术语的选择很奇怪。

我想使用prunestale,但它们已经被占用。

免责声明

Git和Git标志是美国软件自由协会公司(Git项目的公司所在地)在美国和/或其他国家的注册商标或商标。

该标志是Git标志的派生作品。Git标志由Jason Long创作,并许可在Creative Commons Attribution 3.0 Unported License下使用。该标志使用Bitstream Charter。

心灼痛的人像是由https://gvsc.rajephon.dev生成的。

依赖关系

~17–29MB
~500K SLoC