git不尊重core.sharedRepository = group(git push后文件为只读)

时间:2013-12-26 17:01:55

标签: git

我在本地网络上有一个共享git仓库。开发人员克隆存储库,在本地进行更改,然后推送更改。通过ssh访问共享存储库,开发人员使用个人登录凭据。所有用户都具有相同的主要组,即repo中所有文件/目录上的相同组。我使用find命令确保所有目录都是775,所有文件都是664. repo配置有core.sharedRepository = group。 repo是用git init --bare创建的。在创建,克隆并推送了几个更改后,设置了共享设置(文件权限和core.sharedRepository =组)。

我看到的问题是,在推送之后,修改后的文件会将权限从-rw-rw-r - (664)更改为-r - r - r--(444)。由于更改了权限,后续推送同一文件将失败。

我可以使用下面列出的find命令来清理repo但是如果我能在第一时间保持这种状态就很好。

find repoDir -type f -not -writable -exec chmod 664 {} \;
find repoDir -type d -not -writable -exec chmod 775 {} \;

问题:为什么git不尊重core.sharedRepository设置?

服务器repo正在运行git 1.8.4.2

客户端仓库运行gitbash 1.8.0或egit 3.0.3

示例gitbash输出:

编辑文件并推送(成功)

developer@workstation /repo (dev)
$ git push
developer@server password:
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 366 bytes, done.
Total 4 (delta 3), reused 0 (delta 0)
To ssh://developer@server/git/repo
   35b5daa..22b443a  dev -> dev

编辑文件并推送(失败)

developer@workstation /repo (dev)
$ git push
developer@server password:
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 368 bytes, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects
remote: fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To ssh://developer@server/git/repo
 ! [remote rejected] dev -> dev (unpacker error)
error: failed to push some refs to 'ssh://developer@server/git/repo'

developer@workstation /repo (dev)
$

更新

我只是重复了这个例子而没有得到失败 - 看起来这次git将更改放到了对象下的新文件中。新文件具有我没想到的只读权限,但推动至少有效。

2 个答案:

答案 0 :(得分:0)

请注意,在创建文件时,其访问权限位将使用当前进程的umask进行掩蔽,因此如果服务器端git进程运行时umask 077,“group”和“others”三位的位将始终为0,无论进程在调用open(2)时为该文件设置哪种访问模式。

我不确定Git不会尝试做明确的chmod()(在Git的代码中很少调用chmod(2),而且它们似乎与处理推送操作无关。

sharedRepository的Git代码库进行优化会导致读取此设置的唯一位置是git_config_perm中的setup.c函数,然后它被调用的唯一位置是{{1}我估计,这个文件提示这个设置只会影响数据库的创建(builtin/init-db.c,就是这样)。

我不确定从那里开始,只是分享我的发现。

答案 1 :(得分:0)

如果启用core.sharedRepository = group,请确保已连接的用户是该组的成员。在我们的例子中,我们使用' git'用户。