git出现的若干问题以及解决方案

目录

git clone:

1.Failed to connect to github.com port 443 after 21071 ms: Timed out

2.fatal:OpenSSL SSL_read: Connection was reset, erron 10054

3.想git clone特定分支怎么办?

git push:

1.fatal, ref

2.GnuTLS recv error (-110): The TLS connection was non-properly terminated

.git文件瘦身

如何查看git暂存区的文件


git clone:

1.Failed to connect to github.com port 443 after 21071 ms: Timed out

能ping通github.com,但git clone时出现:fatal: unable to access 'https://github.com/RUCAIBox/RecBole.git/': Failed to connect to github.com port 443 after 21071 ms: Timed out

出错原因:

        出现该错误是因为使用了proxy代理,所以要解决该问题,核心操作就是要取消代理;

        取消代理代码为:

                git config --global --unset http.proxy

                git config --global --unset https.proxy

2.fatal:OpenSSL SSL_read: Connection was reset, erron 10054

报错:fatal: unable to access 'https://github.com/.......': OpenSSL SSL_read: Connection was reset, erron 10054

产生原因:一般是这是因为服务器的SSL证书没有经过第三方机构的签署,所以才报错

参考网上解决办法:解除ssl验证后,再次git即可

解除验证:git config --global http.sslVerify "false"

3.想git clone特定分支怎么办?

git clone -b 分支名称 git地址

git push:

1.fatal, ref

报红字的错误,内容大致是fatal, ref...。解决方案:看是否是本地的项目的名字与仓库名字不同导致的。(踩过两次这样的坑) 

2.GnuTLS recv error (-110): The TLS connection was non-properly terminated

方法一(亲测有用):

在终端中按以下步骤输入:

sudo apt-get install build-essential fakeroot dpkg-dev -y
sudo apt-get build-dep git -y
sudo apt-get install libcurl4-openssl-dev -y
cd ~
mkdir source-git
cd source-git/
apt-get source git
cd git-2.*.*/
sed -i -- 's/libcurl4-gnutls-dev/libcurl4-openssl-dev/' ./debian/control
sed -i -- '/TEST\s*=\s*test/d' ./debian/rules
dpkg-buildpackage -rfakeroot -b -uc -us
sudo dpkg -i ../git_*ubuntu*.deb

即使中间出了错也不要理会,全部执行完再次push,成功!

方法二(对我这种情况没起作用):

sudo apt install apt-transport-https

方法三(对我这种情况没起作用):

依次执行

apt-get install gnutls-bin
git config --global http.sslVerify false
git config --global http.postBuffer 1048576000

.git文件瘦身

背景:

        有时候我们不经意间会把一些不必要的大文件上传到github上,而git为了方便之后的回滚会记录这些改变,这样会导致我们的.git文件会很大,如果文件中存在大文件,就会导致:就算我们把它删了重新提交,.git 文件夹依然会占用较大的空间。.git占空间大的话会很影响git clone的速度

        如何解决这个问题呢?其实,Git 已经为我们提供了解决方案,就是被称为核弹级的命令 filter-branch。这个命令可以用来修改历史提交记录,把不需要的文件永久地从历史记录中删除

方法如下:

首先,我们需要找出大文件。

1、找出排名前 10 的 pack 记录,命令如下:

git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -10

看到如下信息: 

b4f24922704061dd41791c3fa138535bdd64047c blob   12159456 10562199 116259793
27017d5df3c9b05786568b1f85863f9f008a464f blob   12160016 10558102 138991863
7009fc1de527e8670e59cf291c659d2541b55188 blob   12707936 11223144 412145772
1cf58693e816034bd210edd0c73a3ab158a8f27a blob   13535824 1480718 90483581
8406e9a6b0dd22381e6bdc1312b293ba60084fd6 blob   13703424 12169871 126821992
e0f54b006ee5fc3ead71d503c7014ed407d08d4f blob   13878960 12302651 423368916
1d168908ee7a0c1fa158038e9134a1155f0e35e0 blob   13964768 10103585 377394839
3cb667151ef9338aacda90e3d66eb916b8a1128a blob   14946592 1608505 88867011
3a8e3688bd4d355174f70915cadbc3ebe4393f7c blob   14990160 12956157 388455577
70c27b00ecf865a97a5b107403d1fc36f5154266 blob   16177592 3269692 74912525

最后一条就是最大的一条记录,70c27b00ecf865a97a5b107403d1fc36f5154266是它的 id。
2、找出该记录对应的文件:

git rev-list --objects --all | grep 70c27b00ecf865a97a5b107403d1fc36f5154266 

 可以看到如下文件信息:

2ec0deab6d9e97802ace6874634ecfa9de944bc5 data/nnie_model/vehicle/person_bike_car.wk

这个文件是模型文件,而且还有其他更多的模型文件,都可以移除。
3、将该文件从历史记录中移除:

git log --pretty=oneline --branches -- data/nnie_model/vehicle/person_bike_car.wk
或者通过对整个文件夹移除,vehicle/下的所有文件会被移除
git log --pretty=oneline --branches -- data/nnie_model/vehicle/*

4、重写所有 commit,将该文件从 Git 历史中完全移除:

移除单个文件
git filter-branch --index-filter 'git rm --cached --ignore-unmatch  data/nnie_model/vehicle/person_bike_car.wk' -- --all
移除整个目录里的所有文件
git filter-branch --index-filter 'git rm --cached --ignore-unmatch data/nnie_model/vehicle/*' -- --all

需要注意的是,此处可能会报错

出现这个错误

Cannot rewrite branches: You have unstaged changes

 

解决方案:执行git stash即可解决。执行完后再次运行上述的git filter-branch....命令。

5、到这里,历史记录中已经没有该文件了。不过运行 filter-branch 产生的日志还是会对该文件有引用,所以还需要运行以下几条命令,把该文件的引用完全删除:

rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc       # 清理不必要的文件并优化本地存储库
git prune    # 该句必不可少

6、这个时候,再看.git文件夹,已经小了很多了。然后就可以 push 代码了,不过就是需要强制 push

git push --force

如何查看git暂存区的文件

git ls-files 

你可能感兴趣的:(工作所获,git,github)