1. .gitignore 法则
.gitignore规则不生效
.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
1、全部清除版本
git rm -rf --cached .
git add .
git commit -m 'update .gitignore'
2、小修小补版本
- 删除track的文件 (已经commit的文件)
- git rm 要忽略的文件
- git commit -a -m “删除不需要的文件” ,注意git commit 命令下 -a 代替了原来的git add命令
- 在.gitignore文件中添加忽略规则
(1) 在.gitignore文件中添加ignore条目, 如: some/path/some-file.ext
(2) 提交.gitignore文件: git commit -a -m “添加ignore规则” - 推送到远程仓库是ignore规则对于其他开发者也能生效: git push [remote]
2. .git文件夹瘦身
github 文件只能管理文本文件,而对于非文本的图片、模型文件等 github 都只能做上传处理,因此相比较于文本文件更替造成的增减量缓存,二进制文件的一点小变动都会造成整个文件的重新上传。在日常维护、模型更替的过程中,.git文件夹越来越臃肿。因此对该文件夹的瘦身工作是非常有必要的事情。
首先 .git/ 文件夹是专门用来管理git仓库的,包含所有git操作所需要的东西。
进行文件夹瘦身时,一般我们有如下三种操作方式:
2.1 简单有效,减小体积
运行 gc ,生成 pack 文件(后面的 --prune=now 表示对之前的所有提交做修剪,有的时候仅仅 gc 一下.git 文件就会小很多)
git gc --prune=now
2.2 设置depth=1
即在clone的过程中只对上一次commit的结果进行clone(只克隆项目中最近一次提交的分支,体积很小)。
这种方法会产生另外一种问题:他只会把默认分支 clone 下来,其他远程分支并不在本地。
所以这种情况下,需要用如下方法拉取其他分支:
$ git remote set-branches origin other-branch-name
$ git fetch --depth 1 origin other-branch-name
$ git checkout other-branch-name
2.3 使用git-lfs管理文件
大概就是git请来的救兵,专门用来管理仓库中的大文件。
Git LFS(Large File Storage, 大文件存储)是可以把音乐、图片、视频等指定的任意文件存在 Git 仓库之外,而在 Git 仓库中用一个占用空间 1KB 不到的文本指针来代替的小工具。通过把大文件存储在 Git 仓库之外,可以减小 Git 仓库本身的体积,使克隆 Git 仓库的速度加快,也使得 Git 不会因为仓库中充满大文件而损失性能。
使用 Git LFS,在默认情况下,只有检出的 上一轮commit 中的 LFS 对象会被下载。此外,我们也可以做配置,只取由 Git LFS 管理的某些特定文件的实际内容,而对于其他由 Git LFS 管理的文件则只保留文件指针,从而节省带宽,加快克隆仓库的速度;也可以配置一次获取大文件的最近版本,从而能方便地检查大文件的近期变动。
LFS的工作机制为:
Git LFS 对象在服务器上可以存储在 Git 仓库之外的任何地方,具体位置由 Git LFS Server 的配置决定,而与 Git 客户端无关。如在 GitLab 中,可以配置文件系统中的一个目录来存储 Git LFS 对象,这个目录是与 Git 仓库无关的,所有的 Git LFS 对象都会根据哈希值存放在其中。
克隆仓库时,git lfs fetch
会作为 git clone
的一部分被执行来获取 Git LFS 对象。而 git lfs fetch
会与 git clone
一并执行则是因为在安装 Git LFS 时,一并安装了相关的 post-checkout hook。在执行 git pull
, git checkout
等命令时也是同理。