如何搭建git服务器
现在我们将要学习如何搭建 git 服务器,如何编写自定义的 Git 钩子来在特定的事件触发相应的动作(例如通知),或者是发布你的代码到一个站点。直到现在,我们主要讨论的还是以一个使用者的身份与Git进行交互。这篇文章中我将讨论git的管理,并且设计一个灵活的 Git 框架。你可能会觉得这听起来是 “高阶 Git 技术” 或者 “只有狂热粉才能阅读”的一句委婉的说法,但是事实是这里面的每个任务都不需要很深的知识或者其他特殊的训练,就能基本理解 Git 的工作原理,有可能需要一丁点关于Linux的知识。
工具/原料
linux服务器
共享Git服务器
1、安装git# yum install -y git
2、创建的 gituser 用户创建一个 ~/.ssh 的框架,并设置好合适的权限。这很重要,如果权限设置得太开放会使自己所保护的 SSH 没有意义。$su-gituser $mkdir.ssh&&chmod700.ssh $touch.ssh/authorized_keys $chmod600.ssh/authorized_keys
3、设置ssh密钥登陆author坡纠课柩ized_keys 文件里包含所有你的开发者们的 SSH 公钥,你开放权限允许他们可以在你的 Git 项目上工作。他们必须创建他们自己的 SSH 密钥对然后把他们的公钥给你。复制公钥到 gituser 用户下的 authorized_keys 文件中。例如,为一个叫 Bob 的开发者,执行以下命令:$cat~/path/to/id_rsa.bob.pub>>/home/gituser/.ssh/authorized_keys只要开发者 Bob 有私钥并且把相对应的公钥给你,Bob 就可以用 gituser 用户访问服务器。
4、设置gituser登陆权限你只是想给他们访问 Git 仓库的权限。因为这个特殊的原因,Git 提供了一个限制的 shell,准确的说是 git-shell。以 root 身份执行以下命令,把 爿讥旌护git-shell 添加到你的系统中,然后设置成 gituser 用户的默认 shell。#grepgit-shell/etc/shells#su-c"echo`whichgit-shell`>>/etc/shells" #su-c'usermod-sgit-shellgituser'
5、root 身份创建一个空的仓库 #gitinit--bare/opt/jupiter.git #chown-Rgituser:gituser/opt/jupiter.git#chmod-R770/opt/jupiter.git现在任何一个用户,只要他被认证为 gituser 或者在 gituser 组中,就可以从 jupiter.git 库中读取或者写入。
6、本地克隆仓库在本地机器尝试以下操作:$gitclonegituser@example.com:/opt/jupiter.git jupiter.cloneCloninginto'jupiter.clone'...Warning:youappeartohaveclonedanemptyrepository.
Git钩子
1、什么是git钩子Git 钩子是一个脚本,它将在一个 Git 过程的某些点运行;钩子可以运行在当一个仓库即将接收一个 commit 时、或者接受一个 commit 之后,或者即将接收一次 push 时,或者一次 push 之后等等。任何放在 .git/hooks 目录下的脚本、使用标准的命名体系,就可按设计好的时间运行。一个脚本是否应该被运行取决于它的名字;pre-push 脚本在 push 之前运行,post-receive 脚本在接受 commit 之后运行。
2、测试钩子想要动手试一个?这很简单。如果你没有现成的 Git 仓库,首先创建一个 Git 仓库: $mkdirjupiter$cdjupiter$gitinit.
3、写一个 “hello world” 的 Git 钩子。因为我为了支持老旧系统而使用 tsch,所以我仍然用它作为我的脚本语言,你可以自由的使用自己喜欢的语言(Bash,Python,Ruby,Perl,Rust,Swift,Go): $echo"#/!/bin/tcsh">.git/hooks/post-commit$echo"echo'POST-COMMITSCRIPTTRIGGERED'">>~/jupiter/.git/hooks/post-commit$chmod+x~/jupiter/.git/hooks/post-commit现在测试它的输出(如下图):

4、有名的push-to-web钩子Git 钩子最流行的用法就是自动 push 更改的代码到一个正在使用中的产品级 Web 服务器目录下。这是摆脱 FTP 的很好的方式,对于正在使用的产品保留完整的版本控制,整合并自动化内容的发布。
Git 变量
1、每一个 Git 钩子都有一系列不同的变量对应触发钩子的不同 Git 行为。你需不需要这些变量,主要取决于你写的程序。如果你只是需要一个当某人 push 代码时候的通用邮件通知,那么你就不需要什么特殊的东西,甚至也不需要编写额外的脚本,因为已经有现成的适合你的样例脚本。
2、在写 Git 钩子之前,看一下 Git 在你的项目目录下 .git/hooks 目录中提供的一些例子。举个例子,在这个 pre-push.sample 文件里,注释部分说明了如下内容:#$1--即将push的远程仓库的名字#$2--即将push的远程仓库的URL#如果push的时候,没有一个命名的远程仓库,那么这两个参数将会一样。#提交的信息将以下列形式按行发送给标准输入#<localref><localsha1><remoteref><remotesha1>
分支检测示例
1、Git 钩子本身是不受版本控制的。Git 并不会瞌伍邦粹跟踪它自己的钩子,因为对于钩子来说,它是 Git 的一部分,而不是你仓库的一部分。所以,Git 钩子可以监控你的 Git 服务器上的一个空仓库的 commit 记录和 push 记录,而不是你本地仓库的一部分。我们来写一个 post-receive(也就是说,在 commit 被接受之后触发)钩子。第一步就是需要确定分支名:#!/bin/tcshforeacharg($<) setargv=($arg) setrefname=$1 end这个 for 循环用来读入第一个参数 $1 ,然后循环用第二个参数 $2 去覆盖它,然后用第三个参数 $3 再这样。在 Bash 中有一个更好的方法,使用 read 命令,并且把值放入数组里。但是,这里是 tcsh,并且变量的顺序可以预测的,所以,这个方法也是可行的
2、有了 commit 记录的 refname,我们就能使用 Git 去找到这个分支的供人看的名字: setbranch=`gitrev-parse--symbolic--abbrev-ref$refname`echo$branch#DEBUG然后把这个分支名和我们想要触发的事件的分支名关键字进行比较:给这个脚本分配可执行权限

3、当一个用户提交到服务器的 master 分支,那些代码就会被复制到一个生产环境的目录,提交到 dev 分支则会被复制到另外的地方,其他分支将不会触发这些操作。同时,创造一个 pre-commit 脚本也很简单。比如,判断一个用户是否在他们不该 push 的分支上 push 代码,或者对 commit 信息进行解析等等。
4、Git 钩子也可以变得复杂,而且它们因为 Git 的工作流的抽象层次不同而变得难以理解,但是它们确实是一个强大的系统,让你能够在你的 Git 基础设施上针对所有的行为进行对应的操作。linux就该这么学,如果你是一个 Git 重度用户,或者一个全职 Git 管理员,那么 Git 钩子是值得学习的,只有当你熟悉这个过程,你才能真正掌握它。