转载文章请保留出处  http://blog.csdn.net/defeattroy/article/details/13775499

git仓库是多人协作使用的,可以基于很多种协议,例如http、git以及ssh等。ssh最为安全方便,配置起来也比较容易,但是权限控制是一个问题,比如下面的场景由两个用户st都给一个仓库贡献代码,那么如果通过ssh协议clone/push的话,会在git仓库的服务端新创建一些文件,主要是objects下面(refs下面文件也会做修改),这些文件的属主和属组就是你这个用户创建一个文件默认的属主和属组,参考下面命令和输入

[steven@localhost demo.git]$ tree -L 2
.
|-- branches
|-- config
|-- description
|-- HEAD
|-- hooks
| |-- applypatch-msg.sample
| |-- .......
| `-- update.sample
|-- info
| `-- exclude
|-- objects
| |-- 10
| |-- 1e
| |-- ......
`-- refs
    |-- heads
    `-- tags
[steven@localhost demo.git]$ ls -l objects/
总用量 160
drwxrwxr-x. 2 steven steven 4096 10月 28 19:37 10
drwxrwxr-x. 2 steven steven 4096 10月 29 18:12 1e

创建的这些目录的属性一般都是775(允许本用户和与本用户处在同一个组的用户修改)或者755(只允许自己修改),当然不能打开其他用户的写权限,那么这就存在一个问题,某用户创建的文件,别的用户就修改不了了,然后git在多人使用过程中又有这样的需求。那么这个问题就可以通过修改用户的默认属组来解决,具体方案如下:

我们创建一个git组,当然也可以同时创建这个用户,因为我打算把git仓库就放在/home/git下面,所以就直接用useradd创建git用户(组)

# useradd git

对于已经有的账户,我们用usermod -g更改账户的主属组

$ su
# usermod -g git steven
[steven@localhost demo.git]$ touch /tmp/test
[steven@localhost demo.git]$ ls -l /tmp/test 
-rw-r--r--. 1 steven git 0 10月 31 17:44 /tmp/test

可以看到创建的文件的属组已经是git了。

对于新建的账户,直接用useradd -g在添加用户的时候指定

$ su
# useradd -g git nicholas

另外,还要确认git目录的写权限

$ su
# chmod 770 /home/git
# chmod g+w objects/
# chmod g+w refs/

还要打开git一个很重要的参数sharedRepository,可以参考文章 
Sharing your git repository

[core]
repositoryformatversion = 0
filemode = true
bare = true
修改前
=================================
修改后
[core]
repositoryformatversion = 0
filemode = true
bare = true
sharedRepository = 1

加这个参数的目的是git在objects目录下创建的目录的属性由

drwxr-xr-x 变成 drwxrwsr-x

注意组权限多了个w,但是r变成s了,这个是因为git通过setgid bit更改这个目录属性(chmod g+s),作用在目录上的setgid可让在该目录下创建的文件继承该目录的组属性,可以参考wikipedia关于setuid, setgid的介绍

至此便可做到让多个人给仓库推送代码了。

如果那个兄弟先看了这个文章悔恨自己在建用户的时候没有考虑主属组,或者用户太多一个个改主属组,而代码目录权限都可以放开的话,那么可以将/home/git目录的权限放开,让所有用户都可以读写,同时在目录上加上setgit bit - sudo chmod g+s /home/git即可。

更多git协同仓库可参考:

http://www.jedi.be/blog/2009/05/06/8-ways-to-share-your-git-repository/

建立多人协作git仓库/git 仓库权限控制(SSH)的更多相关文章

  1. 多人协作解决方案,git flow的使用

    简介 Gitflow工作流程围绕项目发布定义了严格的分支模型. 为不同的分支分配了非常明确的角色,并且定义了使用场景和用法.除了用于功能开发的分支,它还使用独立的分支进行发布前的准备.记录以及后期维护 ...

  2. git+gitolite如何实现权限控制

    前言 首先说明一下,这还是本人第一次写这类文章,如有不妥,多多见谅. 基本情况 因为现在公司的人不是很多,但是还对代码有着严格的管控,所以采用了gitolite的管理方式 其实正常来讲,这种权限的把控 ...

  3. 再谈git的http服务-权限控制hooks版

    通过git-http-backend方法提供的http服务基本上可以做到认证用户才能使用,但只能控制到服务器路径访问,而且无法区分读写.经过不懈努力,找到了方法,相关脚本及配置见后. 基本思路就是利用 ...

  4. git 如何实现进行多人协作开发(远程仓库)

    第一.Git作为分布式的版本控制系统,你是你本地仓库的主人,但是想要实现多人的协作开发,你就要将你本地的开发推送到远程共享仓库中供大家下载,本篇主要以github作为远程服务器来介绍有关远程仓库这块内 ...

  5. 再谈git的http服务-权限控制gitweb版(未成功)

    截至目前,对gitweb的掌握还没达到最终目标,仅仅实现了通过浏览器来浏览项目,通过git命令仍然未能clone项目.但仍然要记录下来,主要是因为打算暂时放弃这条路,而所收获的一些经验还是要记录下来. ...

  6. 利用git 进行多人协作开发

    现在,大部分项目都是用 git 来管理代码的,但当项目变大.多人协作时,git 的使用就变得复杂了,这时就需要在 git 使用的流程上来思考如何更优的使用 git. 对于大部分 web 项目而言,并不 ...

  7. Git_学习_04_ 多人协作开发的过程

    多人协作的工作模式通常是这样: 1.首先,可以试图用 git push origin branch-name 推送自己的修改: 2.如果推送失败,则因为远程分支比你的本地更新,需要先用 git pul ...

  8. Git 分支管理 多人协作 远程仓库 补充

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了, 并且,远程仓库的默认名称是origin. 如果是本地仓库关联远程仓库 --- 要查看远程库的信息,用 ...

  9. Git学习之路(5)- 同步到远程仓库及多人协作问题

    ▓▓▓▓▓▓ 大致介绍 我们写好文件后添加到版本库,但是这样还没有做完,我们还需要将它同步到GitHub的远程仓库上,这里就以我们刚开始的drag项目为例,我们在Git学习之路(2)-安装GIt和创建 ...

随机推荐

  1. Rquest对象代码练习

    1.代码练习 <%@ page language="java" import="java.util.*" pageEncoding="utf-8 ...

  2. Fiddler 捕获 nodejs 模拟的http请求

    1.设置Fiddler Tools->Options-> Connections Allow remote computers to connect: 2.nodejs 请求有多种 2.1 ...

  3. cmd 命令相关

    计算相关进程数: tasklist|find /i "cmd.exe" 安装git的可以 tasklist|find /i "cmd.exe"  | wc -l

  4. drupal sql 源码解析query.inc 文件

    query.inc 文件: sql语句: $this->condition($field);1707 line public function condition($field, $value ...

  5. Eclipse编辑jsp不显示预览效果页面

    转载链接:https://blog.csdn.net/fishsr/article/details/22662787 转载 2014年03月31日 13:35:35 1.Eclipse打开jsp后,在 ...

  6. rabbitmq web管理界面 用户管理

    安装最新版本的rabbitmq(3.3.1),并启用management plugin后,使用默认的账号guest登陆管理控制台,却提示登陆失败. 翻看官方的release文档后,得知由于账号gues ...

  7. Linux终极渗透测试命令总结

    本文主要和大家分享Linux终极渗透测试命令总结,如下是一份 Linux 机器的渗透测试备忘录,是在后期开发期间或者执行命令注入等操作时的一些典型命令,设计为测试人员进行本地枚举检查之用. 命令 描述 ...

  8. chrome input去除黄色背景色

    input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset; border: 1px solid #CCC!impo ...

  9. 找不到reportviewer控件在哪儿

    請自行加入ReportViewer(9.0)到工具箱之中. 如下圖,

  10. LocalBroadcastManager 的使用

    一.使用本地广播发送一条广播(本例为自己发送自己接收,本地广播也可以是其他应用接收)然后接收到广播时回调Receiver类中的回调方法onReceive()在此方法中自定义发出通知 代码 packag ...