我每天都要在Git仓库中创建几个标签。当我有很多标签时,它会使我的存储库变得缓慢或导致其他问题吗?注:我使用的是GitHub,但请笼统地回答。
5rgfhyps1#
(带注解的)标签不会让Git变慢,只是更难使用,因为你将更难在所有中间标签中找到相关的标签。最糟糕的情况是,如果你的网页界面(比如GitHub)必须显示数千个标签,它会让你的网页界面变得迟钝。也许所有这些标记都不需要被推送,在这种情况下,您可以考虑创建中间的本地“轻量级”标记。
km0tfn4u2#
在Windows上使用Git 2.8.1时,当有很多标签(15000个左右)时,我遇到了某些命令的轻微缓慢,包括:
git log
--decorate
git status
这些命令都检查标记来修饰所显示的修订。每个命令比没有标记的命令多花1-2秒。
**更新:**运行git gc(没有--prune)极大地提高了Git的速度,真实的的罪魁祸首可能是频繁的重定基。
git gc
--prune
laawzig23#
我一直使用3位数的版本号来标记我发布给同事的内容,这导致了逻辑问题,因为我希望发布的粒度更细。我一直担心使用更频繁的标记会降低Git仓库的速度,但这里给出的答案无疑消除了这种担忧。现在我将转到4位数样式,如@VonC给出的链接示例所示:“轻量级”标签。我应该早点这么做。我会使用成熟的“带注解”标签。由于每月发布的标签少于10个,Git甚至不会注意到。
sc4hvdpw4#
是的,* 许多 * 标签会降低一些日常git命令的执行速度,包括git pull,git fetch和git push,但是除非你有成千上万个标签,否则你不必担心这个问题。我在一个monorepo上工作,它目前有102,448个标签(git tag | wc -l),我们的Jenkins pipeline标记了它创建的每一个构建,无论是拉取请求构建还是发布构建,下面是它如何影响git fetch的:
git pull
git fetch
git push
git tag | wc -l
$ 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的运行速度:
--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的情况与此类似,即使本地和远程之间没有任何变化。
origin
$ 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环境变量来检查流量:
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,没有配置来避免每个标签的数据包。
4条答案
按热度按时间5rgfhyps1#
(带注解的)标签不会让Git变慢,只是更难使用,因为你将更难在所有中间标签中找到相关的标签。
最糟糕的情况是,如果你的网页界面(比如GitHub)必须显示数千个标签,它会让你的网页界面变得迟钝。
也许所有这些标记都不需要被推送,在这种情况下,您可以考虑创建中间的本地“轻量级”标记。
km0tfn4u2#
在Windows上使用Git 2.8.1时,当有很多标签(15000个左右)时,我遇到了某些命令的轻微缓慢,包括:
git log
(带有--decorate
)git status
这些命令都检查标记来修饰所显示的修订。每个命令比没有标记的命令多花1-2秒。
**更新:**运行
git gc
(没有--prune
)极大地提高了Git的速度,真实的的罪魁祸首可能是频繁的重定基。laawzig23#
我一直使用3位数的版本号来标记我发布给同事的内容,这导致了逻辑问题,因为我希望发布的粒度更细。
我一直担心使用更频繁的标记会降低Git仓库的速度,但这里给出的答案无疑消除了这种担忧。
现在我将转到4位数样式,如@VonC给出的链接示例所示:“轻量级”标签。我应该早点这么做。我会使用成熟的“带注解”标签。由于每月发布的标签少于10个,Git甚至不会注意到。
sc4hvdpw4#
是的,* 许多 * 标签会降低一些日常git命令的执行速度,包括
git pull
,git fetch
和git push
,但是除非你有成千上万个标签,否则你不必担心这个问题。我在一个monorepo上工作,它目前有102,448个标签(
git tag | wc -l
),我们的Jenkins pipeline标记了它创建的每一个构建,无论是拉取请求构建还是发布构建,下面是它如何影响git fetch
的:以下是
--no-tags
的运行速度:这是一个很小的差别,你可以在你的配置中设置
--no-tags
作为默认值(如果你有很多标签):如果需要,可以将
origin
替换为不同的远程,git push
的情况与此类似,即使本地和远程之间没有任何变化。那么到底是怎么回事呢?您可以使用
GIT_TRACE_PACKET
环境变量来检查流量:在输出的某个地方,您会看到许多类似这样的行,每个行对应一个标记:
唯一的缺点是,对于
git push
,没有配置来避免每个标签的数据包。