gpt4 book ai didi

git - 如何减少现有 git 克隆的深度?

转载 作者:IT王子 更新时间:2023-10-29 01:19:31 40 4
gpt4 key购买 nike

我有一个克隆体。我想减少它的历史,而不是从头开始克隆,减少深度。工作示例:

$ git clone git@github.com:apache/spark.git
# ...
$ cd spark/
$ du -hs .git
193M .git

好吧,事实并非如此,但它可以用于本次讨论。如果我尝试 gc 它会变小:

$ git gc --aggressive
Counting objects: 380616, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (278136/278136), done.
Writing objects: 100% (380616/380616), done.
Total 380616 (delta 182748), reused 192702 (delta 0)
Checking connectivity: 380616, done.
$ du -hs .git
108M .git

不过,仍然很大(git pull 表明它仍然可以推/pull 到远程)。重新包装怎么样?

$ git repack -a -d --depth=5
Counting objects: 380616, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (95388/95388), done.
Writing objects: 100% (380616/380616), done.
Total 380616 (delta 182748), reused 380616 (delta 182748)
Pauls-MBA:spark paul$ du -hs .git
108M .git

是的,没有变小。 --重新打包的深度与克隆的深度不同:

$ git clone --depth 1 git@github.com:apache/spark.git
Cloning into 'spark'...
remote: Counting objects: 8520, done.
remote: Compressing objects: 100% (6611/6611), done.
remote: Total 8520 (delta 1448), reused 5101 (delta 710), pack-reused 0
Receiving objects: 100% (8520/8520), 14.82 MiB | 3.63 MiB/s, done.
Resolving deltas: 100% (1448/1448), done.
Checking connectivity... done.
Checking out files: 100% (13386/13386), done.
$ cd spark
$ du -hs .git
17M .git

Git pull 说它仍然与远程同步,这让任何人都感到惊讶。

好的 - 那么如何将现有的克隆更改为浅克隆,而不是修复它并重新检查它?

最佳答案

git fetch --depth 10

这将从源获取最新的提交(如果有的话),然后将本地历史切断到深度 10(如果更长)。

对于正常用途,您的 git 历史记录现在的长度为 10。但请注意,旧的提交仍然占用您磁盘上的空间,并且它们仍然存在于远程存储库中。对所有有权访问远程存储库的人可见和可访问。

如果您的目标是拥有较短的日志,因为您目前不需要多年的提交历史记录,那么您就完成了。你的日志会很短,最常见的 git 命令现在只能看到 10 次提交。

如果你的目标是释放磁盘空间,因为旧的提交有巨大的二进制 blob,你现在不需要工作,那么你必须从磁盘中删除旧的提交。请参阅下面的简短说明,了解如何执行此操作。

如果您的目标是完全删除旧提交(例如从旧提交中删除密码)那么这不是正确的命令。您需要从远程存储库中删除它们。有关如何从远程存储库中删除提交的更多信息,请参阅下面的链接。

撤消 --depth 并再次获取整个历史记录:

git fetch --unshallow

如何删除旧提交以释放磁盘空间。

数据丢失警告!阅读笔记并注意你在做什么。

简而言之:要真正删除提交以释放磁盘空间,您需要删除所有持有它们的引用。即(据我所知)reflog、标签、分支和存储。

清除reflog:

git reflog expire --expire=all --all

删除所有标签:

git tag -l | xargs git tag -d

删除一个分支:

git branch -d branchname

分支很复杂。告知并自己思考如何处理您的分支机构。

至于存储:无论如何它们应该是临时的。所以就像它很热一样把它们扔掉。

git stash drop

一旦删除了所有引用,就可以调用 git 垃圾收集器来删除悬空提交:

git gc --prune=all

现在应该从磁盘中删除旧的提交。

小心数据丢失!阅读下面的注释并在删除之前思考。


笔记

关于删除所有标签命令:该命令将从您的本地存储库中删除所有标签。如果您所有的标签也在 Remote 上,那么这很好。下一个 git fetch 将重新获取相关标签。但是如果你有只在本地存储库中的标签,那么它们就会消失。如果你想保留它们,那么你需要以某种方式保存它们。

分支机构类似。同样远程的分支最终将被重新提取。仅本地的分支将消失。

旧的 reflog 条目在特定时间后由 git 垃圾收集器自动清除(大约 90 天 IIRC)。然而,标签和分支将永远存在。因此,如果您想从旧提交中释放磁盘空间,您至少必须手动删除标签和分支。

reflog 类似于过去本地存储库状态的本地历史记录。许多 git 命令将在 reflog 中记录本地存储库的先前状态。使用 reflog 你可以撤消一些命令,或者至少在你犯了错误时找回丢失的数据。所以在清除 reflog 之前请三思。

reflog 完全在您的本地存储库中。


另见

https://linuxhint.com/git-shallow-clone-and-clone-depth/

http://gitready.com/intermediate/2009/02/09/reflog-your-safety-net.html

How do I edit past git commits to remove my password from the commit logs?

Delete all local git branches

关于git - 如何减少现有 git 克隆的深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38171899/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com