如何将git服务器提供给其他人使用
1 架设Git服务器
我们以Ubuntu为例。首先,在git服务器上创建一个名为 'git' 的用户,并为其创建一个ssh 目录。并将其权限设置为仅git用户有读写权限
$ sudo adduser git
$ su git
$ cd
$ mkdir ssh
$ chmod 700 ssh
接下来,把开发者的 SSH 公钥添加到这个用户的 authorized_keys 文件中。假设你通过电邮收到了几个公钥并存到了临时文件里。重复一下,公钥大致看起来是这个样子:
$ cat /tmp/id_rsajohnpub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair
只要把它们逐个追加到 authorized_keys 文件尾部即可,同时将authorized_keys设置为仅git用户有读写权限。
$ cat /tmp/id_rsajohnpub >> ~/ssh/authorized_keys
$ cat /tmp/id_rsajosiepub >> ~/ssh/authorized_keys
$ cat /tmp/id_rsajessicapub >> ~/ssh/authorized_keys
$ chmod 600 ~/ssh/authorized_keys
现在可以用 --bare 选项运行 git init 来建立一个裸仓库,这会初始化一个不包含工作目录的仓库。
$ cd /opt/git
$ mkdir projectgit
$ cd projectgit
$ git --bare init
这时,Join,Josie 或者 Jessica 就可以把它加为远程仓库,推送一个分支,从而把第一个版本的项目文件上传到仓库里了。值得注意的是,每次添加一个新项目都需要通过 shell 登入主机并创建一个裸仓库目录。我们不妨以 gitserver 作为 git 用户及项目仓库所在的主机名。如果在网络内部运行该主机,并在 DNS 中设定 gitserver 指向该主机,那么以下这些命令都是可用的:
# 在 John 的电脑上
$ cd myproject
$ git init
$ git add
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/opt/git/projectgit
$ git push origin master
这样,其他人的克隆和推送也一样变得很简单:
$ git clone git@gitserver:/opt/git/projectgit
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master
用这个方法可以很快捷地为少数几个开发者架设一个可读写的 Git 服务。
作为一个额外的防范措施,你可以用 Git 自带的 git-shell 工具限制 git 用户的活动范围。只要把它设为 git 用户登入的 shell,那么该用户就无法使用普通的 bash 或者 csh 什么的 shell 程序。编辑/etc/passwd 文件:
$ sudo vim /etc/passwd
在文件末尾,你应该能找到类似这样的行:
git:x:1000:1000::/home/git:/bin/sh
把 bin/sh 改为 /usr/bin/git-shell (或者用 which git-shell 查看它的实际安装路径)。该行修改后的样子如下:
git:x:1000:1000::/home/git:/usr/bin/git-shell
现在 git 用户只能用 SSH 连接来推送和获取 Git 仓库,而不能直接使用主机 shell。尝试普通 SSH 登录的话,会看到下面这样的拒绝信息:
$ ssh git@gitserver
fatal: What do you think I am A shell
Connection to gitserver closed
这里提供的方法,组内所有成员对project都有读写权限,也就是说每个分支都可以push代码,如果需要更加细致的权限控制,请使用Gitosis或者Gitolite。
2 搭建Gitweb
安装gitweb之后就可以通过网站访问我们的项目了。就像http://gitkernelorg一样显示了
首先需要安装Gitweb,如果没有安装apache,那么直接安装Gitweb,也会将apache2安装的。
$ sudo apt-get install gitweb apache2
安装完成之后,我们只需要修改一下配置文件,将/etc/gitwebconf文件中的$projectroot修改为放工程文件的目录。
$ vim /etc/gitwebconf
# path to git projects (<project>git)
$projectroot = "/opt/git";
至此gitweb就可以使用了,现在可以通过http://[git_server_IP]/gitweb访问了。
3 Push之后发送邮件通知
当组内成员push代码到服务器上之后,会自动发送邮件通知组内所有人员,该次push的具体内容是什么。具体配置方法:
一般在安装Git的时候发送邮件的脚本/usr/share/git-core/contrib/hooks/post-receive-email已经存在了,首先要修改所有者和执行权限,并且安装sendmail。
$ sudo chown git:git post-receive-email
$ sudo chmod 755 post-receive-email
$ sudo apt-get install sendmail
然后到切换到工程目录下的hooks中,添加 post-receive软链接指向 /usr/share/git-core/contrib/hooks/ post-receive-email。
$ cd /opt/git/projectgit/hooks
$ ln -s /usr/share/git-core/contrib/hooks/post-receive-email post-receive
最后修改工程目录中的config文件即可。mailinglist是邮件列表, envelopesender是发件人的邮箱,
$ vim /opt/git/projectgit/config
[core]
repositoryformatversion = 0
filemode = true
bare = true
[hooks]
mailinglist = "example@gmailcom, example2@gmailcom" # 收件人列表
envelopesender = projectgit@examplecom # 送件人地址
emailprefix = "[Project commit] " # 邮件标题前缀
showrev = "git show -C %s; echo" # 不只显示有变化的文件,同时也显示改变的内容
为了使邮件显示的更清楚,还要修改一下工程目录当中的description文件,在description文件中,默认第一行是项目名称,所以要在第一行填入该项目的名称,这个在邮件中会有显示。
$ vim /opt/git/projectgit/description
Project_A
首先需要装好CentOS系统,作为测试,你可以选择装在虚拟机上,这样比较方便。这步默认你会,就不讲了。
有了CentOS,那么如何搭建Git服务器呢?
1、首先需要安装Git,可以使用yum源在线安装:
[root@localhost Desktop]# yum install -y git
2、创建一个git用户,用来运行git服务
# adduser git
3、初始化git仓库:这里我们选择/data/git/learngitgit来作为我们的git仓库
[root@localhost git]# git init --bare learngitgit
Initialized empty Git repository in /data/git/learngitgit/
执行以上命令,会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以git结尾。然后,把owner改为git:
[root@localhost git]# chown git:git learngitgit
4、在这里,Git服务器就已经搭得差不多了。下面我们在客户端clone一下远程仓库
Zhu@XXX /E/testgit/834
$ git clone git@192168834:/data/git/learngitgit
Cloning into 'learngit'
The authenticity of host '192168834 (192168834)' can't be established
RSA key fingerprint is 2b:55:45:e7:4c:29:cc:05:33:78:03:bd:a8:cd:08:9d
Are you sure you want to continue connecting (yes/no) yes
Warning: Permanently added '192168834' (RSA) to the list of known hosts
git@192168834's password:
这里两点需要注意:第一,当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host 'githubcom (xxxxxxxx)' can't be established
RSA key fingerprint is xxxxxxxxxx
Are you sure you want to continue connecting (yes/no)
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'githubcom' (RSA) to the list of known hosts
这个警告只会出现一次,后面的操作就不会有任何警告了。
如果你实在担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。
第二,这里提示你输入密码才能clone,当然如果你知道密码,可以键入密码来进行clone,但是更为常见的方式,是利用SSH的公钥来完成验证。
5、创建SSH Key
首先在用户主目录下,看看有没有ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsapub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@examplecom"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到ssh目录,里面有id_rsa和id_rsapub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsapub是公钥,可以放心地告诉任何人。
6、Git服务器打开RSA认证
然后就可以去Git服务器上添加你的公钥用来验证你的信息了。在Git服务器上首先需要将/etc/ssh/sshd_config中将RSA认证打开,即:
1RSAAuthentication yes
2PubkeyAuthentication yes
3AuthorizedKeysFile ssh/authorized_keys
这里我们可以看到公钥存放在ssh/authorized_keys文件中。所以我们在/home/git下创建ssh目录,然后创建authorized_keys文件,并将刚生成的公钥导入进去。
然后再次clone的时候,或者是之后push的时候,就不需要再输入密码了:
Zhu@XXX/E/testgit/834
$ git clone git@192168834:/data/git/learngitgit
Cloning into 'learngit'
warning: You appear to have cloned an empty repository
Checking connectivity done
7、禁用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每次一登录就自动退出。
我使用的gogs+cetos6搭建git服务器,因为gogs搭建服务器比较简单
我给您大概说一下搭建过程
linux服务器上安装mysql,并创建gogs数据库
linux服务器上安装git
linux服务器上安装gogs
运行/gogs web ,然后可以通过浏览器访问: localhost:3000配置服务器
最后是开启防火墙端口3000(gogs默认端口)
因为不熟悉Ubuntu,但是过程是一样的,您可以尝试一下 :)
基本原理:使用copSSH在WINDOWS(XP)上建立SSH服务器;使用生成的“公钥-私钥”对作为身份标识;在服务器上配置SHELL脚本环境;配置客户端,加载私钥。详细过程如下:
安装前准备:
Download copSSH [SourceForge Link] (注:SSH服务器软件)
Download msysgit (注:WINDOWS下的git安装包)
Download TortiseGIT (注:WINDOWS下的git图形化软件,与TortiseSVN是同门)
Download PuTTY Installer (注:生成公钥-私钥对的软件,并可用于SSH客户端的登陆)
Step1 -安装copSSH
1将copSSH(basic edition 200)安装到路径 c:\SSH
2安装过程中写下SvcCOPSSH的密码,你可能永远不会用到,但写下也无伤大雅。
3启动copSSH,选择 开始->所有程序->copSSH->control panel;然后激活一个用户(假定为Administrator,选择Users->Add,下一步,选择一个用户,不要勾选Allow password authenticatin选项,点击forward,OK。
4其他关于public keys的事情无需操作,后面还会讲到。
Step2-配置copSSH
1选择路径-C:\SSH\etc ,在记事本中打开ssh_config 和sshd_config(注意:两个文件有一个字母“d”的区别)
2ssh_config -删除Port前的#号,设置端口号,这里采用默认端口22
3sshd_config -保证端口号一致
4确定系统防火墙中该端口未关闭。(这一点很重要)
5重启系统
Step3-安装Putty
1重启之后,继续回来,现在可以安装Putty Installer了。
2导航至你的安装路径,通常为c:\program files\Putty
3打开PuttyGenexe
4选择生成密钥的长度4096
5在空白面板处不停地晃动鼠标(用于生成随机种子),直到生成结束。(不要关闭PuttyGen)
6来到路径c:\SSH\Home\Administrator\ssh\ (这个路径在你使用copSSH激活用户时会产生,根据你激活的用户名,选择相应的路径),创建文件authorized_keys (注意没有后缀名)
7打开PuttyGen,复制Public Key(公钥)到文件authorized_keys ,并保存
8在PuttyGen中,将Private Key(私钥)保存为private_keyppk,保存在同一目录下。-比如,我的保存目录为c:\SSH\Home\Administrator\ssh\private_keyppk
9现在目录下应该有两个文件了,authorized_keys 和 private_keyppk
10为了测试连接,运行puttyexe
11在打开的界面中输入IP 地址(本机可以为localhost)和端口号
12打开左侧的菜单,选择Connection-SSH-Auth,选择你的私钥文件,c:\SSH\Home\<user>\ssh\private_keyppk
13点击Open,就会打开终端,让你输入Login Name,输入Administrator(注意大小写)
14你会看到显示接受你的公钥(Accept Public Key),客户端登陆成功,登陆信息也会缓存起来。
Step 4-安装 msysgit和TortiseGIT
1安装msysgit的过程中一路下一步即可,假定你的路径为C:\msysgit
2安装TortiseGIT,完成之后
1)在任意路径点右键,选择TortiseGIT-Settings,设置gitexe的路径为c:\msysgit\msysgit\bin,即为msysgit的安装路径
2)在左侧菜单中选择Network,选择SSH Client为putty中的plinkexe(如我的路径为C:\Program Files\PuTTY\plinkexe)
3将几个GIT运行中需要的文件复制到SSH服务器目录,当客户端远程登陆上来以后需要执行这些文件,文件源路径为c:\msysgit\msysgit\Git\libexec\git-core ,要复制的文件包括gitexe, git-receive-packexe, git-upload-archiveexe and git-upload-packexe,将以上文件复制到C:\SSH\Bin
Step5-配置用户环境
1对于copSSH来说,其默认的$HOME环境为c:\Documents and Settings\<user>,GIT也将会在该目录下寻找authorized_keys 文件。当然,这是咱要避免的事儿,我们要将GIT的路径重定向到C:\SSH\Home\<user>\ssh 。
2选择路径C:\SSH\Home\Administrator\,打开bashrc文件,在# User dependent bashrc file下面加上这样一段:export HOME=/c/SSH/home/Administrator Shell Options,(注意不要有其他空格出现),然后选择保存。
3把该文件复制到用户目录下,如: c:\Documents and Settings\Administrator\
Step7-使用GIT和Plink
1打开路径C:\SSH\home\Administrator,创建文件夹myappgit
2 在该文件夹上点右键,选择git create repository here,勾选make it bare,服务器文件仓库创建成功。
3导航至路径c:\Program Files\PuTTY ,打开pageantexe,选择add key,将你的私钥(private_keyppk)加载上。
4然后右键选择 git clone,url设为ssh://administrator@127001:22/SSH/Home/administrator/myappgit ,如果clone成功,恭喜你,大功告成!
关于git的操作详见git的使用说明,这里推荐Pro Git 简体中文版,翻译的很不错。
注:在执行git clone时可能会报错(该错误在所参考的E文中未提及,把俺害得不轻),如果是关于某个dll文件的错(具体是哪个文件记不清了,遇到的朋友可以根据文件名,在msysigt目录下搜索即可找到),可以将该文件同样复制到C:\SSH\Bin下,然后就可以正常运行了。
1创建Gitblit安装目录
首先我们将在我们的服务器上建立一个目录,并在该目录下安装最新的Gitblit。
$ sudo mkdir -p /opt/gitblit$ cd /opt/gitblit
创建gitblit目录
2 下载并解压
现在,我们将从Gitblit官方站点下载最新版的Gitblit。这里我们将安装162版本。所以,请在安装时根据具体的版本对命令进行修改。
$ sudo wget http://dlbintraycom/gitblit/releases/gitblit-162targz
下载gitblit安装包
接下来,我们将下载到的tar压缩包解压至之前创建的目录 /opt/gitblit/
$ sudo tar -zxvf gitblit-162targz
解压gitblit压缩包
3配置并运行
现在,我们将对Gitblit进行配置。如果你想要定制Gitblit的行为,你可以修改gitblit/data/gitblitproperties。在完成配置后,我们将运行安装好的gitblit。有两种方式来运行gitblit,第一种是通过下面的命令手动运行:
$ sudo java -jar gitblitjar --baseFolder data
另一种是将gitblit添加为服务。下面是在linux下将gitblit添加为服务的步骤。
由于我在使用Ubuntu,下面的命令将是 sudo cp service-ubuntush /etc/initd/gitblit,所以请根据你的发行版修改文件名service-ubuntush为相应的你运行的发行版。
$ sudo /install-service-ubuntush$ sudo service gitblit start
启动gitblit服务
在你的浏览器中打开http://localhost:8080或https://localhost:8443,也可以将localhost根据本地配置替换为IP地址。输入默认的管理员凭证:admin / admin并点击login按钮。
gitblit欢迎页面
现在,我们将添加一个新的用户。首先,你需要以admin用户登录,username = admin,password = admin。
然后,点击用户图标 > users > (+) new user 来创建一个新用户,如下图所示。
添加新用户
现在,我们将创建一个开箱可用的仓库。点击 repositories > (+) new repository。然后,如下图所示添加新的仓库。
添加新的仓库
使用命令行创建一个新的仓库
touch READMEmd git init git add READMEmd git commit -m "first commit" git remote add origin ssh://arunlinoxide@localhost:29418/linoxidecomgit git push -u origin master
请将其中的用户名arunlinoxide替换为你添加的用户名。
在命令行中push一个已存在的仓库
git remote add origin ssh://arunlinoxide@localhost:29418/linoxidecomgit git push -u origin master
注意:强烈建议所有人修改用户名“admin”的密码。
Mac好用的GIt管理器推荐:TowerMac版
TowerforMac是应用于macos平台上一款非常强大的Git客户端,Git是目前最流行的版本管理工具之一,TowerGit具有强大的Git资源库管理、版本控制、分支管理等等,并且能够和Xcode、github、Beanstalk、BBEdit等软件无缝结合使用!
TowerMac版
TowerforMac软件特色
1、便于使用
无需记住复杂的命令(及其参数)。Tower使许多高级操作像拖放一样简单。
2、撤消一切
撤消本地更改
恢复旧版本
还原提交
恢复已删除的提交
撤消分支删除
3、清晰的可视化,更好的理解
Tower的清晰视觉界面非常有用-并且使复杂场景更容易理解。
4、自信地使用Git
以简单,直观的方式解决合并冲突
立即查看哪些提交尚未与遥控器同步
停止使用SSH密钥,用户名,密码和身份验证令牌进行摔跤
21 在Git服务器上新建版本库
在使用VS2015进行团队开发前,我们先在Git服务器上创建新的版本库。
打开我们已经安装好的GitStack(如查直接看本篇的同学,可以先看一下服务端环境搭建一文URL:使用GitStack+TortoiseGit 图形界面搭建Git环境)
在GitStack中创建新的版本库,名为“MyGitForVsObject”,并新建两个用户"yubinfeng"和“zhangsan”,再新建一个组"MyGitGroup",将这两个用户加入到该组,并给版本库授权该组。具体操作这里不再赘述,不了解的朋友请看上面的URL
22 在VS2015中克隆远程版本库我们先在VS2015中新建一个解决方案,在工具栏,点“团队”=》“管理连接”
按上图所示,右打开的 团队资源管理器中,输入远程Git URL,点击克隆按钮,即可完成在VS2015中克隆远程版本库了
克隆成功后,可以在 本地Git存储库 中看到 本地版本库已经 从服务器上克隆下来了。
23 Git全局设置完成版本库克隆后,我们需要在Git中进行一次全局设置。
工具栏 - 团队 - 管理连接,打开团队资源管理器
点击主页按钮
点击设置,选择全局设置,完成如下三项更改,点更新
用户名:将作为你以后版本提交后日志显示的名称
电子邮件:团队联系使用
默认存储库位置:最好进行一下改动,默认在C盘,防止丢失
24 Git存储库设置存储库设置和全局设置类同
工具栏 - 团队 - 管理连接,打开团队资源管理器
点击主页按钮,选择 设置 - 存储库设置
其他内容不需要设置,主要 添加一下远程 。这将是以后获取新版本和推送到服务器的地址
此时,我们可以看到项目文件前面有一个小锁,并且代码中已经有了Git的信息,表示项目已经已经受到Git控制
25 第一次向Git服务器发布项目我们上面看到的所有Git的受控信息,只是相对于克隆到本地的版本库,此时Git服务器并没有接收到这些工程文件,下面我们要做的将是第一次将本地版本库中的工程文件同步到Git服务器,即项目发布
工具栏 - 团队 - 管理连接,打开团队资源管理器
点击小房子,回到Git主页,点击同步
我们第一次将本地分支发布到远程服务器,点击发布
输入远程URL,发布,即可发布到远程库
我们可以打开GitStack查看日志
上面显示的时间,为你在本地操作的时间。我们可以看到Git作为分布式版本控制系统,你在离线进行操作,在推送时,显示的均为你操作时间,而非推送时间。
26 拉取、获取、合并、提交、推送、同步项目开发过程中,我们通常进行下面几种操作,我一次性介绍,这个和上篇TortoiseGit类似,直接看本篇的同学,可以参考上篇,URL:图形化Git客户端工具TortoiseGit
拉取(Pull):将远程版本库合并到本地版本库; 相当于(Fetch+Meger)
获取(Fetch):从远程版本库获得最新版本
合并(Meger):将两个版本库进行合并操作
提交(Commit):将所做的更改,存入本地暂存库
推送(Push):将所做的更改,存入远程版本库
同步(Pull+Push):先将远程库拉取,再将本地库推送到远程库 注意这个顺序; 相当于(Pull+Push)
我们对文件进行修改后,文件前有一个小对号,右击,点提交
我们在提交文件时,记得填写备注,在团队开发中,保持一个良好的习惯
提交在这里有三种:
提交:即将文件存入本地版本库
提交和推送:即将文件更改同时存入本地版本库和远程版本库
提交和同步:将文件更改提交到本地库的,再从远程版本库拉取新版本到本地,再推本地库到远程版本库
注意:
这里的操作,不针对当前文件,而是对所有变更进行提交、推送或同步。
27 创建分支对于创建分支在上篇(URL:图形化Git客户端工具TortoiseGit)中已经介绍过了,这里主要介绍一下如何基于Vs2015创建Git分支
工具栏 - 团队 - 管理连接,打开团队资源管理器
点击小房子,回到Git主页,点击分支
打开分支界面,在master分支上右击,选择 "从选定项创建本地分支"
在这里需要注意我们创建分支,有两种:
(1)创建本地分支
(2)创建远程会支
本地分支有创建前,一定要获取最新版本;远程分支,则要求所有成员最好能推送更改。
至于分支的创建是基于远程还是本地,最好能在团队成员之间达成一致。
下面介绍两种分支的创建方法
先看创建本地分支
输入一个分支名称,创建即可。
远程分支,我们需要选择如下
在创建远程分支时,一定要把跟踪远程分支,这个取消选择,否则将创建了一个跟踪分支,我们就不能发布了。
创建完成后,如下:
分支创建成功,接下就是发布到服务器
右击,点发布分支,即可。
可以看到,分支已经发布到服务器上了。
在服务器上通过GitStack也可以看到,多了一个分支。
28 切换和合并分支在VS2015中切换分支非常简单,只要在分支名称上双击,就可以了,项目资源管理器中的文件随之变化。
这里主要看一下合并,
我们先切换到新建的分支"2016-2-7",在分支名称右击,选择 合并自
选择master ,点击合并,即可完成将master合并到新分支了。
29 删除分支删除分支,首先要从远端删除,如下:
注意,如果要删除刚才新建的分支,和上篇TortoiseGit一样,要切换到另一分支操作。
远端删除后,服务器上的分支就被删除了,本地的分支,直接删除即可。
0条评论