git基本操作

摘要

.gitignore 规则不生效的解决办法

把某些目录或文件加入忽略规则发现并未生效,原因是.gitignore只能忽略那些原来没有被追踪的文件,如果某

些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未

被追踪状态),然后再提交:

1
2
3
git rm -r --cached .
git add .
git commit -m 'update .gitignore'

修改提交历史

使用场景:一不小心把 node_modules 目录加入git仓库了,导致仓库很大

核弹级操作,注意备份

已知大文件

1
git filter-branch -f --prune-empty --index-filter "git rm --cached --ignore-unmatch -fr node_modules" -- --all

未知大文件

识别出最大的文件

1
2
3
4
git verify-pack -v .git/objects/pack/pack-b39c5c51f10088875c96f1073840442c0d08f368.idx | sort -k 3 -n | tail -3
9ab9f94ac7d6fea2bdf444e88104bd72670a70b5 blob 46247335 8791786 13950107
b3c7fb8da2fdf8a1f0e906656271db029baf44ce blob 56742730 54432739 101022428
ca099a126474f353ed6a9a36edd34af3bca7d5f1 blob 61498722 8419597 28982757

查询文件名

1
git rev-list --objects --all | grep 9ab9f94ac7d6fea2bdf444e88104bd72670a70b5

将该文件从历史记录的所有 tree 中移除

1
2
3
4
5
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch app/build'

#git filter-branch -f --prune-empty --index-filter "git rm -rf --cached --ignore-unmatch app/build" -- --all

#git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch app/build' --tag-name-filter cat -- --all

回收内存

1
2
3
4
5
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git fsck --full --unreachable
git repack -A -d
git gc --aggressive --prune=now

强制推送

1
git push origin --all --force