title: Git 札记:远程库 date: 2018-12-01 17:46:49 categories:
在用户主目录下,如果有.ssh 目录并且该目录下有 id_rsa 和 id_rsa.pub 两个文件,则跳过这步;否则在 window 下打开Git Bash。
$ ssh-keygen -t rsa -C "tujide.lv@foxmail.com"
一直默认回车,生成的 2 个文件就是 SSH Key 的秘钥对,id_rsa 是私钥,不能泄露,id_rsa.pub 是公钥,可以告诉别人。
查看远程库的详细信息
$ git remote -v
关联远程库并创建别名
$ git remote add <远程仓库别名> git@github.com:GitHub账户名/learngit.git
如果在使用命令 git remote add 时报错(fatal: remote origin already exists.),说明本地库已经关联了一个名叫 origin 的远程库,有如下2种处理方案。
1.删除已有的远程仓库origin,再关联
- $ git remote rm origin
2.因为git是分布布,支持同步到多个远程库,远程仓库的名字不能一样
- $ git remote add gitee git@gitee.com:xxx/xxx.git
- $ git remote add github git@github.com:xxx/xxx.git
将本地库的内容(指定分支)推送到远程库对应的远程分支上(不存在时会自动新建)
$ git push <远程仓库别名> 分支名
把远程库下载到本地,因为是读操作,不需要验证身份
$ git clone git@github.com:GitHub账户名/gitskills.git
--depth=1,用于指定克隆深度,为 1 表示只克隆最近一次 commit,历史旧数据不 clone,可用于解决项目过大时 clone 导致 timeout 的问题,但他只会把默认分支 clone 下来,其他远程分支并不在本地,如需要的话可如下命令拉取其他分支。
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth=1 origin remote_branch_name
GitHub 还会给出多个地址,如 https://github.com/GitHub账户名/gitskills.git,因为 Git 支持多种协议,默认是通过 ssh 支持的原生git协议,速度最快;也可用 https 等其他协议,速度慢,每次推送必须输入口令。
pull = fetch + merge
如果 git pull 提示"no tracking information",则说明没有创建本地分支和远程分支的链接关系,用命令 git branch --set-upstream-to=origin/branch-name branch-name再进行git pull。
$ git pull //如果当前分支只有一个追踪分支,可以省略远程仓库名即可更新并合并
$ git pull origin //如果当前分支有多个追踪分支,可以指定当前分支与指定的远程追踪分支进行更新并合并
$ git pull origin master //指定当前分支与指定的远程master分支进行更新并合并
$ git pull origin master1:master2 //指定本地的master2分支与指定的远程master1分支进行更新并合并
安装命令摘录
sudo yum install -y curl policycoreutils-python openssh-server cronie
sudo lokkit -s http -s ssh
sudo yum install postfix
sudo service postfix start
sudo chkconfig postfix on
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ee
实际问题:yum 安装 gitlab-ee(或ce)时,需要联网下载几百 M 的安装文件,非常耗时,所以应提前把所需 RPM 包下载并安装好。 下载地址为:https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm,调整后的安装过程:
sudo rpm -ivh /opt/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm
sudo yum install -y curl policycoreutils-python openssh-server cronie
sudo lokkit -s http -s ssh
sudo yum install postfix
sudo service postfix start
sudo chkconfig postfix on
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ce
当前步骤完成后重启
GitLab 服务操作
初始化配置 gitlab
$ gitlab-ctl reconfigure
启动/停止 gitlab 服务
$ gitlab-ctl start/stop
浏览器访问
访问 Linux 服务器 IP 地址即可,如果想访问 EXTERNAL_URL 指定的域名还需要配置域名服务器或本地 hosts 文件。
应该会需要停止防火墙服务
$ service firewalld stop
初次登录时需要为 gitlab 的 root 用户设置密码。
安装 Git
$ apt-get install git (Debian系列系统)
$ yum install -y git (RetHat系列系统)
创建Git用户,用来管理 Git服务,并为 Git 用户设置密码
$ id git
$ useradd git
$ echo 'git' | passwd --stdin git &> /dev/null
创建 Git 仓库
先选定一个目录作为 Git 仓库,假定是/home/data/git/sample.git/,在/home/data/git/目录下输入如下命令,Git 就会创建一个裸仓库,裸仓库没有工作区。
$ git init --bare sample.git
因为服务器上的 Git 仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的 Git 仓库通常都以 .git 结尾。然后把 owner 改为 git。
$ chown -R git:git sample.git
Git 打开 RSA 认证
进入/etc/ssh目录,编辑 sshd_config,打开以下三个配置的注释,然后重启 sshd 服务
$ vim sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
$ systemctl restart sshd
或者$ /etc/rc.d/init.d/sshd restart
Tips:由 AuthorizedKeysFile 得知公钥的存放路径是.ssh/authorized_keys,实际上是 $Home/.ssh/authorized_keys,由于管理 Git 服务的用户是git,所以实际存放公钥的路径是/home/git/.ssh/authorized_keys
在/home/git/下创建目录 .ssh,然后把 .ssh 文件夹的 owner 修改为 git
$ mkdir .ssh
$ chown -R git:git .ssh
创建证书登录(添加客户端公钥到服务器)
收集所有需要登录的用户的公钥,就是他们自己的 id_rsa.pub 文件,把所有公钥导入到/home/git/.ssh/authorized_keys 文件里,一行一个
$ ssh git@server 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
Tips:需要输入服务器端 git 用户的密码
查看服务器端 .ssh 下是否存在 authorized_keys 文件
$ ll git/.ssh/
修改 .ssh 目录的权限为 700(rwx------),修改 .ssh/authorized_keys 文件的权限为600(rw-------)
$ chmod 700 .ssh
$ chmod 600 authorized_keys
禁止 git 用户 ssh 登录服务器
出于安全考虑,第二步创建的 git 用户不允许登录 shell,这可以通过编辑/etc/passwd 文件完成。将 bash 修改为 git-shell,找到类似下面的一行:
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@server:/home/data/git/sample.git
Tips:如果 SSH 用的不是默认的 22 端口,则需要使用以下的命令(假设 SSH 端口号是 7700)
$ git clone ssh://git@server:7700/home/data/git/sample.git
管理公钥
管理权限