Git 是一种版本控制软件。Github 是一个公共的服务器,我们可以将自己的项目建立在 Github 上,进而项目参与人员可通过其本机 git 客户端连接 github 进行文件操作,实现项目文件的版本控制。但对于保密性有要求的项目,将其建立在公共服务器上是不明智的,我们可以建立自己的 git 服务器实现版本控制。
本文讨论建立内部 git 服务器供项目参与人员连接使用的方法,并记述了 git 的一些常用命令。
1. 通信协议
客户端和服务器进行通信时,Git 支持 Local,HTTP/S, SSH 和 Git 这几种信息传输协议。
Local 协议只用于客户端和服务器在同一台主机的情况,使用下面的命令复制本地的 git 项目。
$ git clone /opt/git/prj_name.git
Or
$ git clone file:///opt/git/prj_name.git
前者直接从指定的绝对路径中复制 git 项目到当前路径,后者则采用网络传输的方式(本机到本机)。
如果需要将本地已存在的 git 项目加入到本地 git 服务器的某个项目,则在本地 git 项目的根目录下,可以用如下命令。
$ git remote add remote_name /opt/git/prj_name.git
然后就可以使用 git pull 或 git push 进行信息传输了。但需要注意的是,local 协议的文件访问权限和当前用户的文件访问权限一致。
SSH 协议连接 git 服务器的方式类似于 Local 方式,将在下文进行例示。
2. 建立 git 服务器
假设我们已经有了 /opt/git 这样一个路径,亦即我们计划在该目录下管理我们的 git 项目。那么新建一个项目,可以从生成一个 bare repository 开始。
$ git init - -bare /opt/git/prj_name.git
这样其实就完成了建立 git 项目的操作了。
1) 如果采用 local 协议进行信息交换,那么项目参与人员即可通过下面的命令与 git 项目建立连接,并进行 pull 或 push 操作。
$ git clone /opt/git/prj_name.git
然后就能在当前目录找到名为 prj_name 的文件夹,其内部有一个 .git 这样的文件夹。在 prj_name 目录下,我们可以通过以下操作进行测试。
$ touch test.txt
$ git add test.txt
$ git commit test.txt –m “initial commit”
$ git push origin master
上述操作实现了参与人员在自己的项目中添加文件并将其上传到 git 服务器,其他参与人员再次 clone 该项目是,就会发现 test.txt 这个文件出现在 clone 后的文件夹里。这里需要注意 push 操作文件访问权限和当前用户的文件访问权限一致,亦即只有当前用户对 /opt/git/ 文件夹有写权限时,才能 push 成功。
2) 如果采用 SSH 协议进行信息交换,那么项目参与人员即可通过下面的命令与 git 项目建立连接,并进行 pull 或 push 操作。
$ git clone username@host:/opt/git/prj_name.git
输入用户密码后,git 自动将服务器端的 git 项目复制到本地当前文件夹下。此时用户对 git 服务器目录的读写权限和 SSH 用户的读写权限一致。
然而,当项目参与人员较多时,可以创建一个用户组来方便管理文件权限。
$ sudo groupadd git # Add a new group ‘git’
# Create a new user ‘git’ and add to group ‘git’, specify the home directory of user ‘git’
$ sudo useradd –s /sbin/nologin git –g git –d /opt/ git
$ sudo chgrp –R git /opt/git
$ sudo chown –R git /opt/git
$ sudo chmod g+w –R git /opt/git
$ sudo usermod –a –G git dev_user # Add user ‘dev_user’ to group ‘git’
这样通过控制用户组的读写权限,实现控制参与人员写权限的目的。
3. 常用命令
$ git init # Start to track an existing project in git
$ git add –A # Add all files in git tracking
# Commit all files in git tracking
$ git commit –a –m “Initial commit”
$ git status
# Connect a local repository with a remote branch, name the remote branch as origin
$ git remote add origin /opt/git/prj_name.git
$ git remote rm origin # Disconnect with a remote branch
$ git remote –v # List all remote branches
$ git push origin master # Push local master branch to remote origin
# Create a tag with everything tracking in git
$ git tag –a v0.1 –m “Create a tag”
# Create a a new branch based on tag v0.1
$ git checkout –b branch_nm v0.1
$ git checkout master # Switch to a local branch
$ git merge branch_nm # Merge a branch to current branch
$ git rm --cached file_nm # remove file_nm from staging
$ git rm file_nm # untrack file_nm (then the file_nm should be add to .gitignore)
4. 例子:上传本地项目到 github
首先应当在 github 上新建一个空的资源库 myprj,然后将本地 git 库连接到 github 上新建的库并上传项目内容。
$ git init # Start to track an existing project in git
$ git add . # Adds the files in the local repository and stages them for commit.
$ git commit -m "Initial commit" # Commits the tracked changes and prepares them to be pushed to a remote repository (github)
$ git remote add origin https://github.com/user/myprj.git # Connect with the remote repository on github
$ git push origin master # Push local master branch to remote origin
然后就能在 github myprj 下面看到刚刚上传的项目了。
参考文献 https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols