Git相关文章更新, 拆成三篇, 本篇只记录Git使用中的一些比较棘手的问题, 另外两篇一篇讲如何使用 Git 参与开源社区, 另一篇讲解 Git 的常用操作(非入门向), 以后如果有空, 还会有一个单独的 Git 设计与原理分析系列
我对 Git 的理解也不算深, 欢迎大家提出建议.
0x00. 前置
文章基于你已经会基本的使用 Git 最常见的10个命令, 会建立 github/gitlab 账号/仓库, 如果没有这些前置后续很难理解, 建议自行查阅 猴子也会的Git-入门篇, 或者是阮一峰/廖雪峰的 Git 入门教程, 有可能跟着在线教程动手走一下. 后续不会涉及此类基本操作解释.
入门后的查漏补缺, 可以先看看猴子也会的git-高级篇, 纯看Git高级用法效率低也很容易忘. 个人不太推荐.
0x01. Github 22端口无法推送
这个问题的完整描述是: 你在某个网络环境下按往常一样使用github, 本地加了点代码, 推送发现卡在 push 22 port.. debug: pledge: network (debug输出) , 换一个网络环境就没有问题
这个问题非常蛋疼, Google查的也都是不对口的… 因为他们可能就没有体会过墙的牛啤, 这个问题核心原因是网络策略的屏蔽跟阻断, 测试方法很简单, 如果是在公司无线使用, 那么把无线换成自己的手机热点, 如果发现通了, 说明是网络限制,那么在新建/编译 ~/.ssh/config 文件:
1 | Host github |
在~/.ssh/config 文件加入上述即可…可以解决22端口connection xxx ,以及网络模块卡住的问题.
然后如果是多人合作,你想通过ssh访问他人仓库,原本应该是有权限之后, 这样去访问就行 :git clone git@github.com:other/xx.git , 但是你忘记了这样又走回了22端口. 所以应该是 git clone github:other/xxx.git
提醒: 如果因为各种原因导致配置文件无法正确识别, 以上方法失效, 尝试在卡住的地方输入命令如: ls , 然后参考后续后面的问题3
0x02. Github 提交后不显示绿色标记
这个问题多发于 Hexo 推送, 因为不少同学除了master分支, 还建了个 backup 分支用来备份文件, 或者不小心给设置错了邮箱, 但是一直没注意. 但是Github对于提交标记有两个规定:
本地
git的user.email邮箱设置与github的邮箱不匹配, 你需要自行保证一致1
2
3
4
5# git 本地查看配置
git config --list
# 修改命令
git config --global user.email "youremail@xx.xx"非master分支 不会计入提交显示, 包括提交PR, 也必须合并到主分支才会计算.
需要注意的是, 修正后, 之前丢失的提交记录是不会补上的, 所以只能说平常要多注意一下.
0x03. Git clone显示文件名过长
提示一般是 filename too long , 这个是小问题, 可以用一行设置解决, 全局设置:
1 | git config --global core.longpaths ture |
0x04. The remote end hung up unexpectedly 报错
这个问题目前只出现 Hexo 部署的时候, 也异常蛋疼, 因为时好时坏, 且报错还偶尔变化(参考过官方issue). 不过发现麻烦问题后, 首要还是确定根本原因先 (建议先控制变量,把能对比测试排除的先排除,后续这部分我重新整理一下)。
如果 Hexo 报错之前已经提示Connection reset by xx.xx.xx.xx port 22, 说明你git都过不去了, 那先尝试ssh -vT hexo 看看debug信息以及卡在了哪里(注意这个hexo是我在config配置的别名,默认x@x.x)
然后我发现它验证Authentication succeeded ,然后又卡在debug1: pledge: network 这个鬼地方了。。。那还是参考1.的办法,发现仍然卡住(因为这已经是国内网了)
然后尝试排除变量,试试github的ssh测试ssh -vT github ,发现通了,那说明不是git本身问题,多可能是git服务器端出现问题。 (类似docker误删了什么?后续再补充。。)
考虑git版本 or 默认cmder走的OpenSSH版本问题,因为头部显示还是
OpenSSH_for_Windows_7.6p1, LibreSSL 2.6.4考虑hexo自身哪出了问题,因为有时候
hexo clean后可正常考虑服务器git/SSH那边问题,看看日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#1.服务器端测试临时ssh端口
/usr/sbin/sshd -d -p 7777
#2.在你的机器测试去连接
ssh -vT hexo -p 7777
#然后就可以看见两边都有详细信息了,这是失败的时候,会卡在这个环境信息输出之后
Environment:
USER=root
LOGNAME=root
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
MAIL=/var/mail/root
SHELL=/bin/bash
SSH_CLIENT=yourIP 64876 7777
SSH_CONNECTION=yourIP 64876 10.104.145.59 7777
SSH_TTY=/dev/pts/1
TERM=cygwin
XDG_SESSION_ID=7785
XDG_RUNTIME_DIR=/run/user/0
#这个时候我尝试随便输入命令,意外发现居然可以执行...(见下图),然后last查看发现只有瞬时登陆
#更新查看日志变化.同时试着SSH连接看看状态
tail -f /var/log/message #或者secure文件
#可以尝试重启systemd登录模块重启
$ systemctl restart systemd-logind
6.12更新: 今天还是连不上,但是有个**重大突破.** 发现用ssh -vvv hexo 命令,可以进去. 而且百试百灵.但是用ssh -vT 或者普通的ssh连接都会一直卡在pledge network. 原因待后续有空继续排查.(比如vvv到底做了什么)
1 | #再更新.ssh相关参数 |
6.13更新: 今天终于搞好了, 貌似找到了 hexo deploy 失败的原因跟解决方案了. 分析见参考文章. 本质是Nginx和本地git直接发送请求的时候buffer过小导致出了问题.
0x05. LF will be replaced by CRLF
提交 Hexo 生成文件提示大量上述的提示, 就是说你文件的换行符有问题, 当然这主要是Win的锅, 你可以这样设置一下
导致每次hexo g -d 出现大量的上述提示很扰人, 两个方法解决这个问题:
- 在**编辑器(IDE)**里设置保存的时候默认为LF, 而不是跟随系统
- 根本上
git config --global core.autocrlf false, 这等于是关闭了提示
0x06. git无法添加文件
这种情况不知道确切是如何触发的, 多见不同的 git 仓库进行合并和大量的代码迁移, rebase可能出现, windows 上常见.
现象是某些文件明明在本地文件系统存在, 却无法被 git 添加或识别, 你手动 git add /path/to/file 会提示 .gitignore 忽视了它, 但是实际并不是, 接近办法是强制添加,
1 | git add -f /path/to/filename |
