使用git-shell来限制用户ssh登陆

虽然git是分布式的版本管理系统,但对于团队项目开发,通常还是会在单独的服务器上创建一个git server。类似于svn,git server也有好几种配置方式。详情,可以参见git的文档http://git-scm.com/book/en/v2。这里,主要是从上述文档中摘出一部分,说明一下git-shell的用处。

假如,大家都使用ssh的方式来访问:

$ git clone git@10.3.0.99:project.git

这就意味者,访问者具有权限可以ssh登陆到服务器上:

$ ssh git@10.3.0.99

出于安全的考虑,我们最好限制用户只能进行git push/pull,但无法登陆。这可以使用git-shell来完成。

查看一下git-shell的位置:

$ which git-shell
/usr/bin/git-shell

将git-shell的路径添加到/etc/shells文件中,然后修改git用户的shell:

$ sudo chsh git

设置为/usr/bin/git-shell。这样,如果再使用ssh方式登陆,则会报错:

$ ssh git@10.3.0.99
git@10.3.0.99's password: 
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-35-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to 10.3.0.99 closed.

使用git cvsexportcommit来给cvs仓库提交代码

由于GDB还在使用古老的CVS,但是有一个git的镜像。平时工作的时候,就在git上,直到patch review完毕,需要commit的时候,才把patch apply到cvs trunk上,然后commit。这样每次都需要 git format-patchespatch -p1 < foo.patch,很麻烦。

今天发现可以用 git cvsexportcommit 来把git repo里边的某个commit,apply到cvs本地。假如我的当前目录是GDB CVS checkout的source,我的GIT 目录是 ~/Source/gnu/gdb/git

[yao@qiyao:~/Source/gnu/gdb/cvs/src]$ export GIT_DIR=~/Source/gnu/gdb/git/.git
[yao@qiyao:~/Source/gnu/gdb/cvs/src]$ git cvsexportcommit -v 8121953ff81c6cdf36daca2ae797bbd124d01a91
Applying to CVS commit 8121953ff81c6cdf36daca2ae797bbd124d01a91 from parent 4a743c6b2ed69434f546a6559aca1819015ed00d
Checking if patch will apply
Enter passphrase for key '/home/yao/.ssh/id_rsa':
Applying
Patch applied successfully. Adding new files and directories to CVS
Commit to CVS
Patch title (first comment line): Set breakpoint_ops in mi_cmd_break_insert.
Ready for you to commit, just run:
cvs commit -F .msg 'gdb/breakpoint.h' 'gdb/mi/mi-cmd-break.c'

这样以后,我就可以在添加了changelog以后,cvs commit了。注意在使用完了这个命令之后,最好把环境变量 GIT_DIRunset。不然在任何git repo下边,显示的都是这个目录里边的branches。

使用git-svn获取历史悠久的代码

Jia.Liu@hellogcc

这年头你不git好像都不好意思跟人打招呼。
gcc是个svn项目,但是有git-svn可以用。
git svn clone svn://gcc.gnu.org/svn/gcc/trunk gcc
就可以clone出来了,以后你本地就是个git项目了。

但是,这样clone会非常非常慢,因为git需要获取版本信息,现在gcc这么多年了,版本信息?我估计你clone一星期能clone完就不错。

所以,我们可以不要那些很久之前的版本信息,先运行
svn info svn://gcc.gnu.org/svn/gcc/trunk
查看当前的版本号是多少。
Path: trunk
URL: svn://gcc.gnu.org/svn/gcc/trunk
Repository Root: svn://gcc.gnu.org/svn/gcc
Repository UUID: 138bc75d-0d04-0410-961f-82ee72b054a4
Revision: 175617
Node Kind: directory
Last Changed Author: gccadmin
Last Changed Rev: 175616
Last Changed Date: 2011-06-29 08:18:52 +0800 (Wed, 29 Jun 2011)

比如这个是175616,那么我们就可以运行
git svn clone -r175615:HEAD svn://gcc.gnu.org/svn/gcc/trunk gcc
来clone了。

!!!注意!!!
你指定的版本一定要小于175616,等于都不行!所以我用了-r175615。

该方法不适合考古人士。