$ sudo apt-get install git-all
说明:如果安装过程出现找不到包的错误:
E: Unable to locate package git-all
请执行sudo apt-get update
进行linux仓库更新
$ git --version
$ sudo adduser git
git用户创建完成后使用
ll /home
查看,发现其下已存在git用户目录
$ su git
ssh-keygen
生成ssh公钥$ ssh-keygen -o
ssh-keygen
重复上一步骤为当前用户生成ssh公钥,之后使用如下命令将当前用户公钥加入git用户,进行ssh免密处理$ ssh-copy-id -i ~/.ssh/id_rsa.pub git@localhost
执行以上命令出现Connection refused时,说明ssh服务未启动,使用
sudo service ssh start
启动ssh服务,如果启动ssh服务失败说明系统未安装openssh-server或者openssh-server版本有异;先使用sudo apt-get purge --remove openssh-server
移除系统默认openssh-server,使用sudo apt-get install openssh-server
重新安装,安装完成后使用sudo service ssh start
启动ssh服务,然后再执行ssh-copy-id
命令;
$ ssh git@localhost
$ sudo mkdir /mnt/gitrepository
$ sudo mkdir /mnt/gitrepository/myproject.git
$ sudo git init --bare
$ sudo chown -R git /mnt/gitrepository/myproject.git
借助git-shell
工具,可以方便的将用户git
的活动限定在Git相关范围内
$ which git-shell #查看位置,默认在/usr/bin/git-shell
$ sudo -e /etc/shells #此命令会打开系统shell脚本,将git-shell完整路径追加到文件中
使用 chsh -s 命令修改任一系统用户的 shell:
$ sudo chsh git -s $(which git-shell)
这样,用户 git 就只能利用 SSH 连接对 Git 仓库进行推送和拉取操作,而不能登录机器并取得普通 shell。 如果试图登录,你会发现尝试被拒绝,像这样:
$ ssh git@localhost
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to localhost closed.
gitworkspace
目录作为本地仓库,然后进入目录中,右键打开Git Bash Here
$ ssh-keygen.exe -o
authorized_keys
中$ ssh-copy-id -i /c/Users/administrator/.ssh/id_rsa.pub git@localhost
$ git clone git@localhost:/mnt/gitrepository/myproject.git
myproject
中创建一个空文件,随便填写点儿内容,将新文件提交到git仓库中并push
到远程仓库$ git add aaa.txt
$ git commit -am "新建文件"
$ git push
gitworkspace
的同级目录中新建gitworkspace1
,然后进入gitworkspace1
目录,将远程仓库clone到本地,查看clone出的项目,发现项目下已经存在aaa.txt文件设置 Smart HTTP
一般只需要在服务器上启用一个 Git 自带的名为 git-http-backend
的 CGI 脚本。 该 CGI 脚本将会读取由 git fetch
或 git push
命令向 HTTP URL 发送的请求路径和头部信息, 来判断该客户端是否支持 HTTP 通信(不低于 1.6.6 版本的客户端支持此特性)。 如果 CGI 发现该客户端支持智能(Smart)模式,它将会以智能模式与它进行通信, 否则它将会回落到哑(Dumb)模式下(因此它可以对某些老的客户端实现向下兼容)。
$ sudo apt-get install apache2 apache2-utils
$ a2enmod cgi alias env
该操作将会启用 mod_cgi
, mod_alias
和 mod_env
等 Apache 模块, 这些模块都是使该功能正常工作所必须的。
接下来需要将git仓库所在目录的用户组设置为www-data
,这样 Web 服务器才能读写该仓库, 因为运行 CGI 脚本的 Apache 实例默认会以该用户的权限运行:
$ sudo chgrp -R www-data /mnt/gitrepository #将目录授权给组www-data
$ sudo chmod -R g+w /mnt/gitrepository/ #设置目录为组www-data可写可读
/etc/apache2
目录$ sudo vim apache2.conf
添加如下内容:
SetEnv GIT_PROJECT_ROOT /mnt/gitrepository #此处为git仓库所在目录
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /gitrepos/ /usr/lib/git-core/git-http-backend/
ScriptAlias /repos/ /usr/lib/git-core/git-http-backend/
<Files "git-http-backend">
AuthType Basic
AuthName "Git Access"
AuthUserFile /mnt/gitrepository/.htpasswd
Require expr !(%{QUERY_STRING} -strmatch '*service=git-receive-pack*' || %{REQUEST_URI} =~ m#/git-receive-pack$#)
Require valid-user
Files>
$ sudo service apache2 start
.htpasswd
文件$ sudo htpasswd -c /mnt/gitrepository/.htpasswd zhangsan
gitworkspace2
用以验证Smart HTTP
,进入新目录后使用打开git命令行,在命令行中执行:$ git clone http://localhost/gitrepos/myproject.git
进入clone下来的项目目录,编辑已存在的文件,然后提交推送至远程
$ cd myproject
$ vim aaa.txt
$ git commit -am "新增一行001"
$ git push
当进行到git push
命令时,会提示输入用户名/密码,此时输入上面步骤中创建的zhangsan用户,即可正确将修改的文件推送到远程
提示: 如果要限制clone权限则需要在配置apache时>将
Require expr !(%{QUERY_STRING} -strmatch '*service=git-receive-pack*' || %{REQUEST_URI} =~ m#/git-receive-pack$#)
去掉
apt-get install git-all
时已经安装了gitweb,如果未安装,则执行以下命令:$ sudo apt-get install gitweb
/usr/share/gitweb
,因此在apache配置中需要以以下方式配置: Alias /gitweb /usr/share/gitweb
Redirect permanent /repos /gitweb
Options +FollowSymLinks +ExecCGI
AddHandler cgi-script .cgi
AuthType Basic
AuthName "Retricted Files"
AuthUserFile /mnt/gitrepository/.htpasswd
Require valid-user
Directory>
配置gitweb访问的git仓库目录,编辑/etc/gitweb.conf
文件,找到$projectroot
属性,将其值更改为你的git仓库所在目录,eg:/mnt/gitrepository