如何用Git清理未使用的代码

204 阅读7分钟

项目中经常会积累一些未使用的代码,这些代码使项目更难驾驭,也会使未来的开发和调试变得混乱。

闲置代码的原因之一是很难确定它是否还在使用。 在这篇文章中,我们将看一下Git中的一些工具,它们可以帮助你获得一些确信,即删除一段旧代码是安全的。

一般流程

以下是寻找和删除未使用的代码的一般过程。

  1. 找到一段你怀疑是未使用的代码:一个函数、CSS类、模板文件、图片等。
  2. 检查当前的代码似乎没有使用它。
  3. 检查历史记录,试图找到它最后被使用的时间。
  4. 删除它!

Git无法帮助你完成#1,因为它对你使用的编程语言或工具一无所知。 你必须先通过搜索、检查测试覆盖率或其他方式找到你怀疑是未使用的代码。

但一旦你找到了可能未使用的代码,Git 提供了一些工具,可以帮助解决 #2 和 #3 的问题。 让我们来看看。

git grep (或rg )查找当前使用情况

git grep 命令允许你在项目的文件中搜索正则表达式。它只搜索被 Git 跟踪的文件,所以它不会给你生成或安装的文件的结果。 它提供了一个比文本编辑器中查找所有文件功能更灵活的选择。

例如,假设你发现一个可能未使用的 CSS 类,名为splash 。你可以这样在仓库中搜索用法。

如果这没有输出任何东西,这意味着有零个结果。 这意味着你可以合理地确定这个类是未使用的。

动态生成的名字

不幸的是,搜索结果并不能让你百分之百确信某段代码是未使用的。 大多数编程环境允许动态引用,所以可能有任意的代码来创建你要搜索的名字。

...甚至是不明显的。

对于简单的函数调用、单字的CSS类等来说,这样的代码是相当不可能的。但对于多字名称的模板化部分来说,它就比较常见了,比如说。

因此,你可能只搜索名称的单一部分,例如,只搜索 "splash "而不是 "splash-red"。

对语言和项目的一些熟悉也会帮助你知道有哪些动态名称技术在使用。

限制搜索到的文件

如果你要搜索的术语在项目中具有多种含义,你可能会在你的git grep 结果中得到许多误报。 想象一下,"splash "是一个既用于CSS中的 "splash screen",又用于数据模型中的波浪高度计算的术语。 搜索 "splash "可能包含许多不相关的结果,与第二个含义有关。

你可以通过提供Gitpathspecs来限制搜索到的文件。 例如,要限制搜索到的只是HTML文件。

...或者HTMLJavaScript文件。

这将有助于见微知著。

使用ripgrep更快 (rg)

ripgrep, 或rg, 是一个替代性的超级快速文件搜索器。它默认服从.gitignore 文件,所以它也不会给你生成或安装的文件的结果。它值得检查,因为即使在中等规模的项目中,它的性能优势也会为你节省时间。

检查历史与git log

Chesterton's fence指出我们不应该删除某样东西,直到我们明白它为什么被放在那里。 所以即使你很确定某段代码不再被使用,也值得在删除它之前检查一下Git日志。 虽然不一定能git出明确的答案,但值得尝试。

用镐头查找修改。 git log -S

git log(-S ),它接收一个字符串,并将日志限制在只 添加或删除该字符串的提交上。该标志也被称为 "镐头",因为它可以帮助你挖掘日志。 嗨,我们又回到了日志中!

结合起来是很有用的 -S与(至少是)。

  • -p ( )--patch,它显示了提交差异,所以你可以看到哪些行受到了影响。
  • --stat在这里,你可以看到统计信息,这样你就可以知道在提交中哪些文件被修改了。

(我使用一个别名来设置这些标志和其他一些标志)。

例如,为了寻找 "splash "类的使用,你可以运行。

如果你运气好的话,你会发现像上面这样的 "吸烟枪 "提交。 看起来相关的HTML在2019年被删除了,但有人忘了同时删除相应的CSS

如果你不那么幸运,你可能会看到许多不相关的结果。 这些假阳性结果意味着你必须回过头来看几个提交,才能找到相关的结果。 你可以通过再次使用pathspecs限制搜索来帮助避免这种情况。

...或者。

使用一个重词与 --pickaxe-regex

默认情况下 -S执行普通的字符串匹配。 但如果你添加了 --pickaxe-regex,搜索字符串将被解释为一个正则表达式,从而获得巨大的搜索能力。

例如,想象一下使用 -S有许多由于含有 "splash "的词而导致的误报,如 "unsplash "或 "splashing"。 你可以通过使用正则搜索跳过这些结果。

这个词组使用\b 特殊序列来检查单词的边界,所以它只匹配整个单词 "splash"。

请注意,还有-G 标志,用于git log ,它搜索的是一个重名词。不同的是,它匹配的是完整的提交差异,而不仅仅是更改过的行。 因此,它可以从不相关但相近的代码更改中得到一些误报。

检查历史记录的方法是git blame

最后一个工具是 git blame你可以用它来检查某段可能未使用的代码最后一次被触及的时间,并跟踪它到它第一次被添加的时间。

例如,要尝试找到CSS类的历史,你可以责备该文件。

看起来.splash 规则可能是在1234abcdef 中添加的。你可以用git show 1234abcdef 来查看该提交。如果该提交没有添加该规则,而只是移动了它,或者以某种方式调整了该行,你可以检查更早的责备来追溯时间。要做到这一点,用~1 来传递提交散列,表示 "之前的提交"。

然后你就可以进行迭代,直到找到满意的历史。

我发现使用 GUI 来完成这项任务更容易,因为反复运行git blamegit show 是很麻烦的。在 GitHub 上,你可以使用提交页面上的 "责备 "按钮,然后点击 "分层盒 "图标,跳到上一个责备。 更多信息请参见相关文档

最后......删除那段代码

在你调查得很满意之后,你可以砸掉切斯特顿的栅栏,删除那段未使用的代码。 为了帮助代码审查员和未来的代码归档人员,在你的提交描述中总结一下你的调查。

删除一些未使用的样式

  • .splash 自0123456789以来未使用的。
  • .splash-purple添加于1234abcdef,但从未使用。
  • ...

(Lil提示:当删除多个东西时,可以在一个scratch文件中建立你的提交信息,因为你在做。)

然后满意地环视一下房间,看看清理工作做得怎么样了。

愿你的代码库越来越干净。

-阿丹