标签太多会导致Git出现问题吗?

w8f9ii69  于 2023-01-11  发布在  Git
关注(0)|答案(4)|浏览(210)

我每天都要在Git仓库中创建几个标签。
当我有很多标签时,它会使我的存储库变得缓慢或导致其他问题吗?
注:我使用的是GitHub,但请笼统地回答。

5rgfhyps

5rgfhyps1#

(带注解的)标签不会让Git变慢,只是更难使用,因为你将更难在所有中间标签中找到相关的标签。
最糟糕的情况是,如果你的网页界面(比如GitHub)必须显示数千个标签,它会让你的网页界面变得迟钝。
也许所有这些标记都不需要被推送,在这种情况下,您可以考虑创建中间的本地“轻量级”标记。

km0tfn4u

km0tfn4u2#

在Windows上使用Git 2.8.1时,当有很多标签(15000个左右)时,我遇到了某些命令的轻微缓慢,包括:

  • git log(带有--decorate
  • git status
  • 在Visual Studio中查看历史记录。
  • 当head被分离时使用命令提示符(因为Git Bash会在当前目录下打印当前版本)。

这些命令都检查标记来修饰所显示的修订。每个命令比没有标记的命令多花1-2秒。

**更新:**运行git gc(没有--prune)极大地提高了Git的速度,真实的的罪魁祸首可能是频繁的重定基。

laawzig2

laawzig23#

我一直使用3位数的版本号来标记我发布给同事的内容,这导致了逻辑问题,因为我希望发布的粒度更细。
我一直担心使用更频繁的标记会降低Git仓库的速度,但这里给出的答案无疑消除了这种担忧。
现在我将转到4位数样式,如@VonC给出的链接示例所示:“轻量级”标签。我应该早点这么做。我会使用成熟的“带注解”标签。由于每月发布的标签少于10个,Git甚至不会注意到。

sc4hvdpw

sc4hvdpw4#

是的,* 许多 * 标签会降低一些日常git命令的执行速度,包括git pullgit fetchgit push,但是除非你有成千上万个标签,否则你不必担心这个问题。
我在一个monorepo上工作,它目前有102,448个标签(git tag | wc -l),我们的Jenkins pipeline标记了它创建的每一个构建,无论是拉取请求构建还是发布构建,下面是它如何影响git fetch的:

$ time git fetch

________________________________________________________
Executed in   65.70 secs    fish           external
   usr time    2.60 secs    0.11 millis    2.60 secs
   sys time    0.84 secs    1.30 millis    0.84 secs

以下是--no-tags的运行速度:

$ time git fetch --no-tags

________________________________________________________
Executed in    3.17 secs      fish           external
   usr time  943.50 millis    0.09 millis  943.41 millis
   sys time   60.52 millis    1.02 millis   59.49 millis

这是一个很小的差别,你可以在你的配置中设置--no-tags作为默认值(如果你有很多标签):

$ git config --add remote.origin.tagopt --no-tags

如果需要,可以将origin替换为不同的远程,git push的情况与此类似,即使本地和远程之间没有任何变化。

$ time git push
Everything up-to-date

________________________________________________________
Executed in   50.60 secs      fish           external
   usr time  701.75 millis    0.07 millis  701.68 millis
   sys time  401.84 millis    1.12 millis  400.71 millis

那么到底是怎么回事呢?您可以使用GIT_TRACE_PACKET环境变量来检查流量:

$ env GIT_TRACE_PACKET=2 git push

在输出的某个地方,您会看到许多类似这样的行,每个行对应一个标记:

08:38:56.890217 pkt-line.c:80           packet:         push< dca8b5a27bab04c286d4b55e47df22303e06295d refs/tags/actions/2.0.569-PR-31183-1839146375

唯一的缺点是,对于git push,没有配置来避免每个标签的数据包。

相关问题