Linux 和Windows下Git服务器的安装与配置

Linux 和Windows下Git服务器的安装与配置

By 飞雪

       我在安装配置的过程中,测试了许多方法,出现了各种错误,现将我的总结发布如下,在文中摘录了部分网上内容,但是大部分内容都经过我的修正,该掉了网络上很多内容的错误,按照我的方法和注意事项,应该可以很快完成搭建。

1 Git安装与配置

1.1 Linux下安装git服务

1安装 Git

Linux 做为服务器端系统,Windows 作为客户端系统,分别安装 Git

服务器端:

#sudo apt-get install git

安装完后,查看 Git 版本。

[root@localhost ~]# git --version
git version 1.7.1

安装完之后,可以使用 Git Bash 作为命令行客户端。

2服务器端创建 git 用户,用来管理 Git 服务,并为 git 用户设置密码。

[root@localhost home]# id git
id: git:无此用户
[root@localhost home]# useradd git
[root@localhost home]# passwd git

3服务器端创建 Git 仓库

设置/home/data/git/gittest.git Git 仓库。

然后把 Git 仓库的 owner 修改为 git

[root@localhost home]# mkdir -p data/git/gittest.git
[root@localhost home]# git init --bare data/git/gittest.git
Initialized empty Git repository in /home/data/git/gittest.git/
[root@localhost home]# cd data/git/
[root@localhost git]# chown -R git:git gittest.git/

4客户端创建 SSH 公钥和私钥

$ ssh-keygen -t rsa -C "[email protected]"

此时C:\Users\用户名\.ssh 下会多出两个文件id_rsa id_rsa.pub

id_rsa 是私钥;

id_rsa.pub 是公钥。

5服务器端 Git 打开 RSA 认证

进入 /etc/ssh 目录,编辑 sshd_config,打开以下三个配置的注释:

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

保存并重启 sshd 服务:

[root@localhost ssh]# /etc/rc.d/init.d/sshd restart

AuthorizedKeysFile 得知公钥的存放路径是 .ssh/authorized_keys,实际上是$Home/.ssh/authorized_keys,由于管理 Git 服务的用户是 git,所以实际存放公钥的路径是/home/git/.ssh/authorized_keys

/home/git/ 下创建目录 .ssh

[root@localhost git]# pwd
/home/git
[root@localhost git]# mkdir .ssh
[root@localhost git]# ls -a 
. .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla .ssh

然后把 .ssh 文件夹的 owner 修改为 git

[root@localhost git]# chown -R git:git .ssh
[root@localhost git]# ll -a
总用量 32
drwx------. 5 git  git  4096 8  28 20:04 .
drwxr-xr-x. 8 root root 4096 8  28 19:32 ..
-rw-r--r--. 1 git  git    18 10 16 2014 .bash_logout
-rw-r--r--. 1 git  git   176 10 16 2014 .bash_profile
-rw-r--r--. 1 git  git   124 10 16 2014 .bashrc
drwxr-xr-x. 2 git  git  4096 11 12 2010 .gnome2
drwxr-xr-x. 4 git  git  4096 5   8 12:22 .mozilla
drwxr-xr-x. 2 git  git  4096 8  28 20:08 .ssh

6将客户端公钥导入服务器端/home/git/.ssh/authorized_keys 文件

回到 Git Bash 下,导入文件:

$ ssh [email protected] 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

需要输入服务器端 git 用户的密码。

回到服务器端,查看 .ssh 下是否存在 authorized_keys文件:

[root@localhost git]# cd .ssh
[root@localhost .ssh]# ll
总用量 4
-rw-rw-r--. 1 git git 398 8  28 20:08 authorized_keys

可以查看一下是否是客户端生成的公钥。

重要:

修改 .ssh 目录的权限为 700

修改 .ssh/authorized_keys 文件的权限为 600

 

[root@localhost git]# chmod 700 .ssh
[root@localhost git]# cd .ssh
[root@localhost .ssh]# chmod 600 authorized_keys

 

7禁止 git 用户 ssh 登录服务器

之前在服务器端创建的 git 用户不允许 ssh 登录服务器,该操作依据版本不同,可能有所不同,在我使用的版本中,禁用之后,客户端无法向远程服务端推送,此处可以选择禁止用户名密码登录,不禁止此用户ssh登录服务器。

编辑 /etc/passwd

找到:

git:x:502:504::/home/git:/bin/bash

修改为

git:x:502:504::/home/git:/bin/git-shell

此时git 用户可以正常通过 ssh 使用 git,但无法通过 ssh 登录系统。

7创建本地库并初始化

新建代码仓库文件夹gitlab,创建代码库文件夹gittest.git,进入gittest.git,使用命令git --bare init 初始化。

git@raspberrypi:~$ mkdir gitlab

git@raspberrypi:~$ mkdir gitlab/gittest.git

git@raspberrypi:~$ cd gitlab/gittest.git

git@raspberrypi:~/gitlab/mytest.git$git --bare init

注意:

1)在向远程git服务器push之前,远程代码服务器必须首先建立代码库,并初始化,否则会发生错误。

2)初始化要使用git --bare init,如果使用git init来初始化,需要修改配置文件,否则推送时也会出现错误。

1.2 Windows下安装git服务

1)首先打开 Git 的官方网站:http://git-scm.com/

2)然后找到下载页面:http://git-scm.com/downloads

找到Windows版本的下载页面:http://git-scm.com/download/win

因为准备使用TortoiseGit做图形客户端,所以就不选择Git GUI 版本. 打开Windows的下载页面后,应该会自动弹出下载框,选择保存即可. 如果没有弹出,可以右键点击页面中的click here to download manually., 选择另存为即可,如果资源下载很慢,可以使用迅雷。

建议将下载好的软件安装包统一分类放到某个目录,如:E:\SOFT_N\Tools_ALL\Git_ALL,方便以后查找使用。

文件通过浏览器下载完成后,需要修改文件的锁定属性,特别是.zip文件和.chm文件(否则打开chm会显示404). 右键点击下载的文件,选择属性,然后点击"解除锁定"按钮,确定即可. 如下图所示:

去除文件锁定(非必须)

3)然后鼠标双击安装文件,如果有Windows拦截警告,允许即可

4)然后出现安装向导界面,点击下一步(Next)即可:

安装向导界面

5)接着出现授权信息界面,Next即可:

授权信息界面

6)选择安装路径

7)选择文件关联,如果你不清楚,直接默认,下一步即可. 如果你想要右键菜单清爽一点,就把下图中的那个勾给去掉. 这里把所有勾去掉也是可以的,更清爽(我就是这么干的).

8)接着出现开始菜单文件夹,默认,下一步即可:

9)然后是是否配置Path的配置,选择中间一个,可以通过 Windows命令行(CMD)调用 git 命令。然后点击下一步.

10)选择回车换行的格式。默认即可.(检出时转换为Windows风格,提交时转换为Linux风格.)

回车换行风格(CRLF-LF)

11)然后是安装进度界面

12)安装完成. 去掉那个查看版本说明的复选框,点击完成(Finish)按钮即可.

13)可以在cmd里面测试是否设置了Path,是否安装成功。在CMD中输入git或者git --version试试:

14)如果按照前面的步骤安装下来,那么 git 程序所在的路径已经添加到系统 PATH (path就相当于系统自动查找路径列表),所以可以直接在任意路径的 cmd 下执行 git 命令. 如果没有添加,则需要 cd 切换到Git所在的 bin 目录下,才能执行 git 命令.

15)设置你自己的昵称与email

设置本地机器默认commit的昵称与Email. 请使用有意义的名字与email.

git config --globaluser.name "tiemaocsdn"

git config --globaluser.email "[email protected]"

git config --globalpush.default simple

如果要使用git进行推送,则必须配置push.default,否则推送失败. 姓名与Email只用于日志标识.实际推送到GitHub等在线仓库时,要用有操作权限的账号登录.

查看git配置可以使用-l参数(l 就是 list 的首字母,L的小写):

git config -l

在某个项目根路径下面可以设置单独的Email与姓名.

git config user.name"tiemaocsdn"

git config user.email"[email protected]"

可以看到,配置单个项目时,少了--global参数.

 

2 TortoiseGit的安装与配置

TortoiseGit 简称 tgit中文名海龟Git. 海龟Git只支持神器 Windows 系统,有一个前辈海龟SVN TortoiseSVNTortoiseGit都是非常优秀的开源的版本库客户端. 分为32位版与64位版.并且支持各种语言,包括简体中文(Chinese simplified;zh_CN)

注意:XP系统已经不支持最新的安装包,请尽量使用 Win7 或更高版本的操作系统。

2.1 TortoiseGit安装

需要先安装程序包,然后安装语言包(LanguagePack). 因为TortoiseGit 只是一个程序壳,必须依赖一个 Git Core,也就是上一节我们安装的 Git. 所以安装前请确定已完成上一节的操作. 下面以64位版本为演示(6432位除文件名不一样,其他的操作都一致)

1)双击安装程序TortoiseGit-2.3.0.0-64bit.msi.弹出安装向导界面:

2)下一步,进入版权信息界面. 直接点击下一步(Next)即可.

3)下一步,选择SSH客户端. 可以选择TortoiseGitPlink(位于TortoiseGit安装目录/bin )也可以选择 Git 默认的SSH客户端,位于 Git安装目录/bin/ssh.exe(如果配置了 Path,那直接是 ssh.exe)

4)接着是选择安装目录,可以保持默认,或者安装到开发环境目录下,安装的程序组件保持默认即可:

5)下一步到确认安装界面,点击 Install按钮安装即可,如下图所示:

6)安装完成,点击 Finish 按钮即可:

7)如果以前有老版本,则选择覆盖,关闭旧程序并尝试重启即可

8)安装语言包

双击打开TortoiseGit-LanguagePack-2.3.0.0-64bit-zh_CN.msi,则弹出语言包安装向导:

9)点击下一步(Alt+N)语言包会自动安装完成:

点击完成按钮即可

2.2 TortoiseGit配置

1)首先,请选定一个存放Git项目的目录,这样管理方便. 如:F\STUDY\GIT_STUDY然后在资源管理器中打开.

2)在空白处点击鼠标右键,选择 --> TortoiseGit --> Settings然后就可以看到配置界面:

3)选中General,在右边的 Language中选择中文。不勾选自动升级的复选框,可能还需要指定Git.exe文件的路径,如 "D\DevlopPrograms\Git\bin"。完成后,点击应用,确定关闭对话框.(当然,你也可以继续使用英文)

4)再次点击鼠标右键,可以看到弹出菜单中已经变成中文。原来的Settings变成设置;Clone变为克隆。

5)配置右键菜单. 在设置对话框中,点选左边的"右键菜单",然后在右边将所有的复选框都去掉,这样右键菜单显得比较干净:

6)设置记住密码

密码会明文保存在C\Users\Administrator\.git-credentials种文件中, 请小心使用。

进入设置,点选左边的Git标签.可以发现,右边可以配置用户的名字与Email信息。如下图所示:

因为当前还没有本地项目,所以编辑本地 .git/config(L)”按钮处于灰色不可用状态,如果在某个本地Git项目下打开配置对话框,那么这个按钮就可用,然后就可以编辑此项目的一些属性。

点击编辑全局 .git/config(O)”按钮,会使用记事本打开全局配置文件,在全局配置文件中,在后面加上下面的内容:

[credential]

helper = store

完成后保存,关闭记事本,确定即可。

则当你推送项目到GitHub等在线仓库时,会记住你输入的用户名和密码(这里不是用户的姓名和Email)

如果你编辑的是本地“.git/config(L)”,其实这个翻译为本地有点问题,应该叫局部,也就是在某个项目下面设置,只对此项目有效,配置是一样的。

①  用户名:就是你注册的账号,如: tiemaocsdn

②  密码:当然是注册时填写的密码: *********

③  Email是你的联系邮箱,给别人联系你时使用;

④  用户姓名/昵称:可以随便取,但最好有点意义。

2.3 TortoiseGit创建本地库并提交到远程服务器

1)在D盘新建一个目录,例如"D:\git",并进入目录右键目录空白处选择"Git Createrepository here...",弹出对话框点确认,这样即建立了一个本地Git仓库。

2)在该仓库目录下创建一个测试项目文本文件,右键目录空白处,选择Git Commit -> "master" ...,在弹出对话框里输入提示注释,选择要加入的版本控制文件,确定即可提交。


3)现在只是在本地实现使用Git管理项目,在此界面若显示Success则本地提交成功,接下来点击Push..,把我们的改动递交到Git服务器上。

4)此时会弹出Push对话框,在Ref - Remote栏里设定当前分支名为master,然后点击Destination -Remote栏的Manage按钮。

5)在弹出的设置对话框中按照如图所示,填写服务器Remote名称,URL([email protected]:root/tesproject.git),之前保存的本地私钥testkey.ppk,点击Add New/Save按钮保存这一设置,然后点击确定退出返回之前的对话框。

6)最终确认提交

7push成功

8)这时会出现“git did not exitcleanly (exit code 128)”错误,解决方法是:在远程服务器上创建testproject.git,然后在push工程。即在gitolite-admin/conf/gitolite.conf文件中增加工程和权限并push到远程服务器。

 

2.4 TortoiseGit密钥认证配置

1)使用Puttygen来生成生成ssh连接的公钥,私钥。

Puttygen 来生成密钥,以后可以不用密码登录服务器了。

Puttygen 是密钥生成器,用来生成一对公钥和私钥供 PuttyPSCPPlinkPagent 来使用。

直接运行 Puttygen 可以看到如下的界面。

点击 Generate 按钮就开始生成一个公钥和私钥对,生成完毕后,点下面的 Save privatekey 就可以把私钥保存起来,扩展名是 .ppk 的文件。

Load 按钮可以把先前保存的私钥重新打开,然后做些修改,比如修改注释和私钥口令,或者把 Putty 格式的私钥转换为 OpenSSH 格式的。

2)开始用 Puttygen 创建密钥

单击 Generate 按钮,然后你会看到进度条上面有个提示“Please generatesome radomness by moving the mouse over the blank area.”,意思就是让你用鼠标在空白区域随机移动。随着鼠标在空白区域的移动,进度条会一直走下去。停止移动鼠标,进度条也就停止了。那我们就移动鼠标,直到进度条走满为止。

等进度条走完之后,会出现下面的界面

最上面那个大大的只读文本框里面是公钥,用来保存到 OpenSSH authorized_keys文件中,这个文件中的每一行都是一个公钥。默认情况下,这个文件位于 Linux 用户主目录的 .ssh/ 子目录中,如果文件和目录都不存在,可以直接创建。

但是创建的文件、目录和用户主目录($HOME, $HOME/.ssh,$HOME/.ssh/authorized_keys)的权限有个限制就是对除了本帐户的其他所有帐户都要求是只读的,否则的话,即使公钥、私钥都匹配无误,也是无法登入系统的。这是 SSH 服务器的一个安全要求,因为如果别的帐户可以修改你的 authorized_keys的话,恶意的增加一个公钥,那对方不用你的帐户口令也能以你的帐户登入系统了。

还有一个要强调的是那个 Key comment,这是密钥的注释,一定要修改。因为这个密钥是给自己用的,所以最起码要输入自己的名字,用默认的注释很容易和其他人的密钥混淆的。如果担心自己的密码忘记了,可以在后面加上密码提示,当然了,不要让别人用注释猜出你的密钥口令。比如,我可以把注释修改为

ChaiFeng[20061120] w.z.

后面的 w.z. 就是我的密码提示,能猜出来么?


输入注释,上面的公钥也会随之发生变化。
现在最重要的是,输入自己的密钥口令。就是 Key passphrase Confirmpassphrase 这个两个输入框。
如果不输入口令,直接保存私钥会看到这个提示。为了安全起见还是输入口令吧,要不任何人得到这个私钥都可以不用口令登入系统了。

最后单击 Save privatekey 来保存私钥吧,保存到自己认为安全的地方,比如存放到私人的 USB 闪存盘上。需要登录时,插上 USB 闪存盘。登录完毕后就可以把 USB 闪存盘取下来,哈哈,这样子就比较安全了。

大家也注意到了,还有个 Save public key按钮,这个是保存 SSH2 格式的公钥,有些 SSH 服务器要求用这种格式的公钥文件。一般情况下,我们是不需要的,所以这里也就保存了。以后还想的话,就用 Puttygen 把私钥 Load 出来,然后再保存也可以。

 

(3)添加ssh公钥到服务器

第二步得到了一对公钥跟私钥,现在要把公钥添加到服务器中。

首先,服务器中安装ssh服务(服务器中设置,用户不需要设置,只是为了文档完整性)

home 目录下输入命令 ssh-keygen

会生成一个.ssh目录,进入看到有生成了公钥(id_rsa.pub),私钥(id_rsa),不过我用的是Puttygen生成的那一对,这对密钥不使用。

接下来添加在.ssh目录下增加一个authorized_keys文件(用来保存用户提交的公钥)。

其次,上传用户自己的公钥。

我这里使用pscp,创建文件如下,直接将pscp.exe放入,file文件夹是要上传的文件内容,即用的上传的公钥(跟pscp.exe同级)

上传.txt里面具体内容如下

 

@echo off 

pscp.exe -l gitser -pw "6" -r"file/"     [email protected]:/home/gitser/.ssh

pause

 

//其中前面的gitser 是用户,pw 后面的6是密码,file是要上传的文件夹

其中root是登陆用户,后面是地址,冒号后面是具体要上传的位置

再将上传.txt后缀改为bat再点击运行就上传了

 

最后,将公钥(上图是111)里面的内容添加到authorized_keys里面去

添加成功文件111

使用cat 111 >>authorized_keys添加内容

这样服务器那边就彻底设置好了。

注意文件权限问题(此处很重要)

注意目录和文件的权限,家目录git的权限设置为755,.ssh的权限设置为700,authorized_keys的权限设置为600。具体如下:

chmod 755 /home/git

/home/git/.ssh 的 owner 应该为 git:group

chmod 700 /home/ git /.ssh

chmod 600 /home/ git /.ssh/authorized_keys

如果使用ssh公钥私钥认证,则TortoiseGit的网络配置一定设置如下:

如何ssh客户端设置为ssh.exe则,每次都需要输入密码。

 

附录:常见错误

这个异常的原因是:在git 提交时没有写注示文字。

原因引发条件:$git commit

解决方法:$git commit -m "helloi will commit"

2 Git使用过程遇到的问题

1. git push 出错以及server端没有显示push后的文件的解决方法

Git: push 出错的解决master-> master (branch is currently checkedout)

在使用GitPush代码到数据仓库时,提示如下错误:

[remote rejected]master -> master (branch iscurrently checkedout)
remote: error: refusing to update checked out branch:refs/heads/master
remote: error: By default, updating the current branch in anon-bare repository
remote: error: is denied, because it will make the index and worktreeinconsistent
remote: error: with what you pushed, and will require 'git reset--hard' tomatch
remote: error: the work tree to HEAD.
remote: error:

这是由于git默认拒绝了push操作,需要进行设置,修改.git/config添加如下代码:

[receive]

denyCurrentBranch = ignore

或执行:gitconfig receive.denyCurrentBranch ignore 达到相同作用。

在初始化远程仓库时最好使用git --bare init 而不要使用:git init

如果使用了gitinit初始化,则远程仓库的目录下,也包含worktree,当本地仓库向远程仓库push时,如果远程仓库正在push的分支上(如果当时不在push的分支,就没有问题),那么push后的结果不会反应在worktree上,也即在远程仓库的目录下对应的文件还是之前的内容,必须得使用git reset--hard才能看到push后的内容。

2. git pull出现如下错误:

You asked me to pull without telling me whichbranch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:   [branch "master"]
 remote = <nickname>
 merge = <remote-ref>
 [remote "<nickname>"]
 url = <url>
 fetch = <refspec>
See git-config(1) for details.

解决:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

3 git did not exitcleanly (exit code 128)的解决方案

在Network—>SSH Client里配置路径,默认如图:

修改为:

注意:此处的路径可能是:“C:\ProgramFiles\Git\usr\bin\ssh.exe”,也可能是“C:\Program Files\TortoiseGit\bin\ssh.exe”,具体情况以ssh.exe实际所路径为准,此处务必设置,否则可能会影响TortoiseGit的使用。

在gitclone 的时候复制SSH地址,不要搞错到GitRead-Only那个地址

在clone的时候要勾选LoadPutty Key并选中私钥

 

之后的操作按正常流程走就行了,最后再push更改

有时候会提示说branch不同步之类的,具体错误信息里会说明,先pull一下再push就可以了。

对于提示一些网络超时之类的错误多试几次就Ok了

遇到gitdid not exit cleanly (exit code 128)的错误原因有很多种

LZ的这种方案采用ssh链接地址(非只读地址),并通过私钥认证身份来同步更新

之前也有想过是只读git地址的问题,但当时ssh链接地址连clone都无法完成,才遭至后面乱七八糟的问题

总之以后大家遇到此类问题不妨着此方法一试,(最好把公私钥重新设置一遍)希望对大家有所帮助

补充:

1.当从远端拉取源码提示要输入密码时往往是下面没有设置:

 

将此界面的参数设置即可。

2.从远端拉取源码后传输到我的开发板上的Linux下时文件中出现^M符号,导致文件无法使用,这是Linux和windows的换行符不一致导致的,TortoiseGit中设置如下:

 

然后删除目录从源码重新克隆下载,注意不能直接拉取。

检查一下服务器上/home/git 目录的权限。

注意目录和文件的权限,家目录git的权限设置为755,.ssh的权限设置为700,authorized_keys的权限设置为600。具体如下:

chmod 755 /home/git

/home/git/.ssh 的 owner 应该为 git:group

chmod 700 /home/ git /.ssh

chmod 600 /home/ git /.ssh/authorized_keys

 


猜你喜欢

转载自blog.csdn.net/feixuedongji/article/details/79834633