最小体积拉取git仓库并保持可更新

本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/18487788



对于超大型的git 仓库不需要提交只是拉取代码进行查看并希望保持代码更新,那么使用depth不仅能得到极小体积的仓库还能大大提速拉取时间

拉取最小代码#

结论:功德+1,来自于掌门的用法,depth设置为300之后,基本上没碰到问题,git新手也可以完整拉取。

拉取代码:git clone http://git-internal.nie.netease.com/xxx.git --depth=1 -b 分支名

原始仓库有10G+但通过上述方式拉下来的git仓库才311MB,为何这么小?

这是因为git clone --depth=1只会克隆一个分支最近一次的commit,这样这个项目文件就不会很大,缺点就是只能看到最近一次的log。

其他远程分支并不在本地,所以这种情况下,需要用如下方法拉取其他分支

Copy
$ git clone --depth 1 https://github.com/dogescript/xxxxxxx.git $ git remote set-branches origin 'remote_branch_name' $ git fetch --depth 1 origin remote_branch_name $ git checkout remote_branch_name

depth=1 git pull无法拉取更新#

在我本地使用git pull 无法拉取到新的修改,报错:fatal: refusing to merge unrelated histories,并且git fetch也无法拉取,完整的git log如下:

Copy
git.exe pull --progress -v --no-rebase --depth 1 "origin" POST git-upload-pack (423 bytes) POST git-upload-pack (434 bytes) remote: Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 From http://git-internal.nie.netease.com/xxx = [up to date] 分支名 -> origin/分支名 fatal: refusing to merge unrelated histories

这篇文章《加速几十倍 git clone 速度的 --depth 1,它的后遗症怎么解决? - 知乎 (zhihu.com)》,提到可以使用pull,但我本地却不行。

通过命令:git pull --rebase origin 分支名,就可以,但仍然是只有最后一次的提交log,最后修改depth的参数改大到300,就解决了。

长久未更新分支非常多冲突#

我们有一个hotfix分支用来处理每周发版本后的更新,这个分支上有个文件每周都会被反复频繁修改然后在下个周期发版会被清空为空白文件。

重点来了:多周没更新之后在本地进行git pull或 fetch&rebase拉远程代码都会产生非常多冲突,每次都要花大量时间时间处理冲突

pull的选项不管怎么选,都无法成功,报错信息一般是:

  1. fatal: refusing to merge unrelated histories
  2. fatal: Not possible to fast-forward, aborting

image-20240924171418947

解决办法#

解决办法如下:强制重置到远端分支的最新版本,操作步骤

  1. 使用pull进行拉取一遍(不要勾depth),尽管此时会pull失败,但能拉取远端最新的log,为后面做准备
  2. 在仓库中右键 show log
  3. 在log窗口的左上角点击分支名,切到远程分支最新日期的提交
  4. 回到log窗口,选中最新的提交记录,右键【reset 分支名 to this】,在reset窗口中选择【hard】进行完全重置

PS:碰到无法pull也可以使用此方法来解决

image-20240924165351039

扩展资料#

tortoisegit选项 fast forward only和no fast forward是什么意思

在Git中,Fast-forward和No-fast-forward是两种不同的合并策略。

  1. Fast-forward(快进):如果当前分支没有新的提交,而待合并的分支有新的提交,那么Git会直接将当前分支指向待合并分支的最新提交。这种情况下,Git不会创建新的合并提交。这就像你快进电影到最新的场景,所以叫做"Fast-forward"。

  2. No-fast-forward(非快进):无论待合并的分支是否有新的提交,Git都会创建一个新的合并提交,并将当前分支指向这个新的合并提交。这样做的好处是,你可以清楚地看到项目的历史变化,知道何时进行了合并操作。

在TortoiseGit中,"Fast forward only"选项表示只进行快进合并,如果不能进行快进合并,那么操作会失败。"No fast forward"选项表示进行非快进合并,即使可以进行快进合并,Git也会创建一个新的合并提交。

其它方案拉取最小代码#

git pull --rebase origin 分支名

git submodule update --remote

有兴趣的同学可以尝试

作者:赵青青   一名在【网易游戏】做游戏开发的程序员,擅长Unity3D,游戏开发,.NET等领域。
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
posted @   赵青青  阅读(123)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签
CONTENTS
点击右上角即可分享
微信分享提示