搭建私有git仓库

简单步骤:
1、安装git服务,并创建git账号
2、创建示例仓库sample
3、导入客户端公钥
4、客户端连接并提交内容
5、修改Git权限,只使用git-shell命令

— detail —

一、安装git
直接通过apt-get安装git。使用这个方式比较简单,当然也可以使用git源代码自己编译最新版本。

apt-get update

apt-get install git -y

1.1 创建git用户
创建git账户并登录,直接指定用户目录到/home/git

useradd git -d /home/git -m -s /bin/bash

passwd git //设置git用户的密码

Enter new UNIX password: //输入新密码,输入的密码无回显
Retype new UNIX password: //确认密码
passwd: password updated successfully

su git

添加用户 user add
-d:指定用户目录
-m:如果目录不存在则创建
-s:可以指定用户使用的命令

二、创建sample库
创建库很简单,注意使用–bare参数。作为代码仓库服务器并不会在上面修改东西,所以只要有相关提交日子就可以。

cd ~ git init –bare sample.git
三、设置SSH Key
收集客户端公钥,复制到服务器上。 客户端当前账号RSA或DSA的数字签名文件id_rsa.pub 在.ssh用户目录中。通常情况下windows在 %userprofile%.ssh 目录中,Mac在~/.ssh目录中。

mac上可以直接使用下面命令复制粘贴板上,或使用ssh上传

pbcopy<~/.ssh/id_rsa.pub win7上可以打开Git GUI界面有个帮助->show SSH Key菜单,如果没创建过可以点击创建SSH的签名文件,并复制公钥保存到服务器上。如果使用第三方的SSHKey服务,那可能实际位置会有些差异。

生成本地用户的签名文件,并把客户端上公钥导入到服务器上。如果有多个的话可以放在一个目录中,方便导入。如果是团队人比较多这种方式可能就不太适合了。

如把客户端的key文件mymac.pub和mywin.pub导入。 ssh-keygen -t rsa -b 4096
cat mymac.pub >> ~/.ssh/authorized_keys cat mywin.pub >> ~/.ssh/authorized_keys
3.1 客户端获取sample库,并增加文件上传到服务器
在Mac客户端获取。

git clone ssh://git@221.99.99.99:9922/home/git/sample.git
Cloning into ‘sample’…
warning: You appear to have cloned an empty repository.
Checking connectivity… done.
获取成功OK,增加一个文件,并提交到服务器上
cd sample
cat >> readme.md
first file.
^c
git add .
git commit -m “first commit” git push origin master
3.2 服务器上查看状态
$ git log
commit 8b070256af351b43a74753f0b05969fcfe9c7310
Author: moguf moguf_notify@163.com
Date: Sun Apr 3 20:49:17 2016 +0800

first commit

3.3 在Win客户端获取
windows上可以直接使用git或TortoiseGit获取。

git@192.168.10.14:/home/git/sample.git
新建一个文件并提交到服务器上。在服务器上通过git log就能看到第二提交的内容。mac客户机上git pull能看到刚才新加的文件。

这样Git服务器仓库功能基本完成。

四、安全问题
为安全考虑Git账号只允许使用git-shell。在passwd文件中找到git用户,把/bin/bash直接修改成/usr/bin/git-shell 登录root账号,并修改git的用户权限。

$ su

vim /etc/passwd

这样git用户只能git-shell命令不能登录了。

使用 su git 命令就会出现下面提示,git用户就无法登录到shell,这样就OK了。

su git

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.

github设置添加SSH

很多朋友在用github管理项目的时候,都是直接使用https url克隆到本地,当然也有有些人使用 SSH url 克隆到本地。然而,为什么绝大多数人会使用https url克隆呢?

这是因为,使用https url克隆对初学者来说会比较方便,复制https url 然后到 Git Bash 里面直接用clone命令克隆到本地就好了。而使用 SSH url 克隆却需要在克隆之前先配置和添加好 SSH key 。

因此,如果你想要使用 SSH url 克隆的话,你必须是这个项目的拥有者。否则你是无法添加 SSH key 的。

https 和 SSH 的区别:

1、前者可以随意克隆github上的项目,而不管是谁的;而后者则是你必须是你要克隆的项目的拥有者或管理员,且需要先添加 SSH key ,否则无法克隆。

2、https url 在push的时候是需要验证用户名和密码的;而 SSH 在push的时候,是不需要输入用户名的,如果配置SSH key的时候设置了密码,则需要输入密码的,否则直接是不需要输入密码的。

在 github 上添加 SSH key 的步骤:

1、首先需要检查你电脑是否已经有 SSH key

运行 git Bash 客户端,输入如下代码:

$ cd ~/.ssh
$ ls

这两个命令就是检查是否已经存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已经存在,那么你可以跳过步骤2,直接进入步骤3。

2、创建一个 SSH key

$ ssh-keygen -t rsa -C "your_email@example.com"

代码参数含义:

-t 指定密钥类型,默认是 rsa ,可以省略。
-C 设置注释文字,比如邮箱。
-f 指定密钥文件存储文件名。

以上代码省略了 -f 参数,因此,运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的 SSH key 代码,如:

Generating public/private rsa key pair.
# Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]

当然,你也可以不输入文件名,使用默认文件名(推荐),那么就会生成 id_rsa 和 id_rsa.pub 两个秘钥文件。

接着又会提示你输入两次密码(该密码是你push文件的时候要输入的密码,而不是github管理者的密码),

当然,你也可以不输入密码,直接按回车。那么push的时候就不需要输入密码,直接提交到github上了,如:

Enter passphrase (empty for no passphrase): 
# Enter same passphrase again:

接下来,就会显示如下代码提示,如:

Your identification has been saved in /c/Users/you/.ssh/id_rsa.
# Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.
# The key fingerprint is:
# 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com

当你看到上面这段代码的收,那就说明,你的 SSH key 已经创建成功,你只需要添加到github的SSH key上就可以了。

3、添加你的 SSH key 到 github上面去

a、首先你需要拷贝 id_rsa.pub 文件的内容,你可以用编辑器打开文件复制,也可以用git命令复制该文件的内容,如:

$ clip < ~/.ssh/id_rsa.pub

b、登录你的github账号,从又上角的设置( Account Settings )进入,然后点击菜单栏的 SSH key 进入页面添加 SSH key。

c、点击 Add SSH key 按钮添加一个 SSH key 。把你复制的 SSH key 代码粘贴到 key 所对应的输入框中,记得 SSH key 代码的前后不要留有空格或者回车。当然,上面的 Title 所对应的输入框你也可以输入一个该 SSH key 显示在 github 上的一个别名。默认的会使用你的邮件名称。

4、测试一下该SSH key

在git Bash 中输入以下代码

$ ssh -T git@github.com

当你输入以上代码时,会有一段警告代码,如:

The authenticity of host 'github.com (207.97.227.239)' can't be established.
# RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
# Are you sure you want to continue connecting (yes/no)?

这是正常的,你输入 yes 回车既可。如果你创建 SSH key 的时候设置了密码,接下来就会提示你输入密码,如:

Enter passphrase for key '/c/Users/Administrator/.ssh/id_rsa':

当然如果你密码输错了,会再要求你输入,知道对了为止。

注意:输入密码时如果输错一个字就会不正确,使用删除键是无法更正的。

密码正确后你会看到下面这段话,如:

Hi username! You've successfully authenticated, but GitHub does not
# provide shell access.

如果用户名是正确的,你已经成功设置SSH密钥。如果你看到 “access denied” ,者表示拒绝访问,那么你就需要使用 https 去访问,而不是 SSH 。

如果你有什么疑问或指正,请留言。

参考文档:https://help.github.com/articles/generating-ssh-keys

搭建Git服务器

第一步,安装git

$ sudo apt-get install git

第二步,创建一个git用户,用来运行git服务:

$ sudo adduser git

第三步,创建证书登录:

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件(ssh-keygen命令生成),把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

cat -n id_rsa.pub > authorized_keys

重启ssh服务: service ssh restart

第四步,初始化Git仓库:

先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

$ sudo git init --bare sample.git

Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git

$ sudo chown -R git:git sample.git

第五步,禁用shell登录:

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

第六步,克隆远程仓库:

现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.

剩下的推送就简单了。

github_study2_版本回退

1.查看我们提交了哪些版本
[code]
git log
git log –pretty=oneline //精简查看
[/code]

2.回退到上一个版本
[code]
git reset –hard HEAD^
git reset –hard HEAD^^ //上上的版本
[/code]

3.回退/向前穿越到指定版本
[code]
git reset –hard 3628164 //log 里面commit id对应的前7位数字
[/code]

4.想恢复到新版本怎么办?找不到新版本的commit id怎么办?
在Git中,总是有后悔药可以吃的。当你用$ git reset –hard HEAD^回退到上个版本时,再想恢复到指定版本,就必须找到指定版本的commit id。Git提供了一个命令[code]git reflog[/code]用来记录你的每一次命令

现在总结一下:
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset –hard commit_id。

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

github_study1

1.配置Git
首先在本地创建ssh key;
[code]ssh-keygen -t rsa -C "your_email@youremail.com"[/code]
后面的your_email@youremail.com改为你在github上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key。
回到github上,进入 Account Settings(账户配置),左边选择SSH Keys,Add SSH Key,title随便填,粘贴在你电脑上生成的key。

2.为了验证是否成功,在git bash下输入:
[code] ssh -T git@github.com[/code]
如果是第一次的会提示是否continue,输入yes就会看到:You’ve successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github。

3.执行 [code]git init[/code] 以创建新的 git 本地仓库
接下来我们要做的就是把本地仓库传到github上去,在此之前还需要设置username和email,因为github每次commit都会记录他们。
[code]git config –global user.name "your name" git config –global user.email "your_email@youremail.com"[/code]
进入要上传的仓库,右键git bash,添加远程地址:
[code]$ git remote add origin git@github.com:yourName/yourRepo.git[/code]

3.远端服务器上的仓库克隆到本地
[code]git clone username@host:/path/to/repository[/code]

4.你的本地仓库由 git 维护的三棵”树”组成。第一个是你的 工作目录,它持有实际文件;第二个是 暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。
你可以提出更改(把它们添加到暂存区),使用如下命令:
[code]git add <filename>
git add *[/code]
这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:
[code]git commit -m "代码提交信息"[/code]
现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。

5.推送改动
你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库:
[code]git push origin master[/code]
可以把 master 换成你想要推送的任何分支。

6.在github.com上 建立了一个小项目,可是在每次push的时候,都要输入用户名和密码,很是麻烦

原因是使用了https方式 push

在命令里边 输入 Git remote -v

可以看到形如一下的返回结果

origin https://github.com/yuquan0821/demo.git (fetch)

origin https://github.com/yuquan0821/demo.git (push)

下面把它换成ssh方式的。

[code]
git remote rm origin
git remote add origin git@github.com:yuquan0821/demo.git
git push origin
[/code]

7.切换分支
创建一个叫做”t1″的分支,并切换过去:
[code]git checkout -b t1[/code]
切换回主分支:
[code]git checkout master[/code]
再把新建的分支删掉:
[code]git branch -d t1[/code]
除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:
[code]git push origin <branch>[/code]

8.更新与合并
要更新你的本地仓库至最新改动,执行:
[code]git pull[/code]
以在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。
要合并其他分支到你的当前分支(例如 master),执行:
[code]git merge <branch>[/code]
在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:
[code]git add <filename>[/code]
在合并改动之前,你可以使用如下命令预览差异:
[code]git diff <source_branch> <target_branch>[/code]