我在本地网络上有一个共享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将更改放到了对象下的新文件中。新文件具有我没想到的只读权限,但推动至少有效。
答案 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'用户。