GIT 第11章 问题集锦

2016-07-27 鲁鲁槟

一、git 钩子

自动更新服务器上版本库

①、问题来源

使用git以后,开始在push文件以后总是需要到服务器上去git pull 才能更新,很是麻烦。

②、问题的解决

后来查找资料,发现git有类似于svn中的钩子设置,在hooks文件夹的文件中。

③、解决步骤

我使用的是 gitosis 来管理 git 版本库,所以,在 repositories 中的项目中的 hooks 文件中进行设置,开始设置 post-receive,发现shell 脚本可以运行,git 可以运行,唯独在文件中添加 git pull 时会报错,提示:"fatal: Not a git repository: '.'"。

hook 脚本执行了 cd 之后,继续执行 git 语句拉取的时候还是在 hooks 文件夹下,而不是 cd 的文件路径。

<span style="font-size: 16px;">Shell代码
#!/bin/sh
export.UTF-8
cd /www/myproject/
unset GIT_DIR //重要是这里..
git pull origin master
</span>

上面主要是添加了unset GIT_DIR

git 的 hooks 里面默认有一些环境变量,会导致无论在哪个语句之后执行 git 命令都会有一个默认的环境路径,既然这样 unset 掉默认的 GIT 环境变量就可以了。

二、HTTP request failed

还可能是sslVerify失败, 解决办法:

取消git sslVerify

<span style="font-size: 16px;">git config –global http.sslVerify false
</span>

三、SSL connect error

  • github不支持tlsv1.1后, 出现
<span style="font-size: 16px;">git config --global http.sslversion tlsv1
</span>

四、用户名密码

git pull/push项目的时候总是提示要输入用户名密码的解决方案

<span style="font-size: 16px;">git config --global credential.helper store
</span>

五、修改 github 上仓库的项目语言

① 问题原因: github 是根据项目里文件数目最多的文件类型,识别项目类型

② 解决办法:新建 .gitattributes 放置项目根目录

.gitattributes 的内容为(根据你想修改的代码语言进行编辑,下面是 PHP 代码语言)

<span style="font-size: 16px;">*.js linguist-language=PHP
*.css linguist-language=PHP
*.html linguist-language=PHP
</span>

六、post-receive

git服务器搭建post-receive 钩子部署服务端代码

①、git服务器搭建

安装git

<span style="font-size: 16px;">apt-get install git
</span>

创建git用户

<span style="font-size: 16px;">adduser git
passwd git  //修改git用户密码
</span>

创建git仓库

<span style="font-size: 16px;">cd /home
mkdir git
mkdir ./git/.ssh
touch./git/.ssh/authorized_keys
cd /home/git
git init --bare test.git    //初始化仓库
chown -R git:git ../git
</span>

使用git用户生成git密钥(把客户端的公钥(id_rsa.pb文件内容)添加到authorized_keys文件,git push操作就不需要每次都输入密码了)

<span style="font-size: 16px;">sudo -u git ssh-keygen -t rsa -C “test@qq.com”   //生成密钥
cd /home/git/.ssh
cat id_rsa.pub>>authorized_keys  //把公钥加入authorized_keys文件
</span>

创建web目录

<span style="font-size: 16px;">cd /home
git clone ssh://git@127.0.0.1/home/git/test.git
chown -R git:git test
</span>

编写自动更新钩子

<span style="font-size: 16px;">cd /home/git/test.git/hooks/
vim post-receive
</span>
<span style="font-size: 16px;">#!/bin/sh
cd /home/test/
unset GIT_DIR
git pull origin master
</span>

给钩子文件添加执行权限

<span style="font-size: 16px;">cd /home/git/test.git/hooks/
$ chmod +x post-recevie
</span>

②、以上步骤完成git服务器就已经搭建好了,下面来讲一下客户端的使用操作

首先生成客户端密钥,且把公钥复制到authorized_keys文件里

<span style="font-size: 16px;">ssh-keygen -t rsa -C "test@qq.com"   //生成密钥
cat /userdir/.ssh/id_rsa.pub    // 把显示的内容复制到服务端的authorized_keys文件里
</span>

然后把git仓库拷贝下来

<span style="font-size: 16px;">git clone ssh://git@123.456.78.9/home/git/test.git
</span>

测试操作(git push完成后git自动对web目录做git pull操作)

<span style="font-size: 16px;">cd test
git pull origin master
touch test.txt
git add .
git commit -m "test"
git push origin master
</span>

七、git/ssh捋不清的几个问题

①、rsa 与 rsa.pub

通过 ssh-keygen -t rsa -C "something" 可以生成两个文件,这两个文件的命名默认是 id_rsa 和 id_rsa.pub,如果你在键入上述命令回车之后,重新输入了命名,那此时生成的两个文件就是 [命名] 和 [命名].pub,这个好理解。

主要是解释下生成了两个什么东西。id_rsa 可以称之为私有密钥,id_rsa.pub 可以称之为公有密钥。我们会把公有密钥交给服务端,当需要从服务端请求内容的时候,要带上私有密钥。此时,服务器会通过一定的算法计算私有密钥,并判断计算的结果是否与公有密钥一样,如果不一样则响应请求失败。

<span style="font-size: 16px;">+-----------+                           +-----------+
|           |                           |           |
|           |    enc(rsa) == rsa.pub    |           |
|  client   | ------------------------> |   server  |
|           |             ?             |           |
|           |                           |           |
+-----------+                           +-----------+
</span>

rsa.pub 里面是个什么东西,其实很简单:

<span style="font-size: 16px;">ssh-rsa base64(加密内容) "something"
</span>

而 rsa 中是:

<span style="font-size: 16px;">-----BEGIN RSA PRIVATE KEY-----
base64(私有密钥的一些处理)
-----END RSA PRIVATE KEY-----
</span>

②、known_hosts 文件

这是个什么文件呢?一般情况下 windows 下不会产生这个文件,先说说他是干什么的。当我们成功与服务端进行连接时,ssh 会记录服务端的 Host、IP 以及 rsa 文件,当连接过程中出现:

<span style="font-size: 16px;">Permanently added "10.0.0.0" (RSA) to the list of known hosts.
</span>

如果你选择 Yes,那这个 known_hosts 文件中就会多出一条记录。windows 是不会自动产生这个文件的,也可能是程序产生了,但是没权限写入,所以我们没有在 .ssh/ 目录下看到这个文件。但如果我们创建了这个文件,会发现里面的内容会随着我们的验证慢慢增加。

八、代码发布系统

①、codepub

暴走皮皮虾之代码发布系统,是现代的持续集成发布系统,由后台管理系统和agent两部分组成,一个运行着的agent就是一个节点,本系统并不是造轮子,是"鸟枪"到"大炮"的创新,对"前朝遗老"的革命。


阅读 2226