git不遵守core.sharedRepository=group(git推送后文件只读)
我在本地网络上有一个共享git回购。开发人员克隆repo,在本地进行更改,然后推送更改。通过ssh访问共享repo,开发人员使用个人登录凭据。所有用户都有相同的主组,即repo中所有文件/目录上的相同组。我使用find命令确保所有目录都是775,所有文件都是664。回购配置的core.sharedepository=group。repo是用git init--bare创建的。共享设置(文件权限和core.sharedepository=group)是在创建、克隆和推送多个更改后设置的 我看到的问题是,在推送之后,修改过的文件会将权限从-rw-rw-r--(664)更改为-r--r--(444)。由于权限更改,该文件的后续推送将失败 我可以使用下面列出的find命令清理repo,但如果我能在第一时间阻止这种情况发生,那就太好了git不遵守core.sharedRepository=group(git推送后文件只读),git,Git,我在本地网络上有一个共享git回购。开发人员克隆repo,在本地进行更改,然后推送更改。通过ssh访问共享repo,开发人员使用个人登录凭据。所有用户都有相同的主组,即repo中所有文件/目录上的相同组。我使用find命令确保所有目录都是775,所有文件都是664。回购配置的core.sharedepository=group。repo是用git init--bare创建的。共享设置(文件权限和core.sharedepository=group)是在创建、克隆和推送多个更改后设置的 我看到的问
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输出示例:
编辑文件并推送(成功)
编辑文件并推送(失败)
更新:
我只是重复了这个例子,但没有失败——看起来这次git将更改放在了对象下的一个新文件中。新文件具有我没有预料到的只读权限,但推送至少起到了作用。请注意,创建文件时,其访问权限位将受当前进程的
umask
屏蔽的约束,因此如果您的服务器端git
进程使用umask077
、“组”和“其他”运行无论进程在调用open(2)
时为文件设置了何种访问模式,位的三元组始终为0
我不确定Git是否尝试执行显式chmod()
s(在Git的代码中,对chmod(2)
的调用很少,而且它们似乎与处理推送操作无关
为sharedRepository
对Git代码基进行grep,得到的结果是读取此设置的唯一位置是setup.c
中的Git\u config\u perm
函数,然后调用它的唯一位置是内置/init db.c
文件,我认为,该文件提示此设置仅影响dat的创建abase(gitinit
,即)
我不确定从哪里开始,只是分享我的发现。如果启用core.sharedepository=group,请确保连接的用户是该组的成员。在我们的例子中,我们使用“git”用户。请给出一个“失败”的推送命令示例.您所描述的行为似乎是正确的:有人推X版,git将其存储为只读文件(顺便说一句,您不应该弄乱它),其他人再也不能推X版了。用git bash Output更新的问题需要更多信息。由于git的数据库是一个不可变的对象存储,所以预期对象文件是以只读方式创建的。尽管您使用了
find
命令,我怀疑.git/objects
上的权限仍然不正确。如果我理解正确地说,-writeable
仅适用于运行find
的用户,因此,如果目录属于当前用户,但不属于组可写目录,则不会执行chmod。实际上,没有理由不为第二个find命令单独执行-type d
。我期待的是objects/xx/sub director下的文件在将sharedRepository配置项设置为group的情况下,在git server repo中保留其664权限。推入共享repository后,这些文件重置为444是否正常?core.sharedRepository
设置会影响大多数变异操作。它也可以从setup.c中的check\u repository\u format
调用
是大多数操作的先驱。(请参见path.c
中的calc\u shared\u perm
和adjust\u shared\u perm
)我是否需要确保每个用户的~/[shell]中都有“umask 002”rc文件对我的服务器进行更新repo有664权限?我目前无法重现此问题,但如果我将来遇到此问题,我会记住您的建议。
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)
$