Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git不遵守core.sharedRepository=group(git推送后文件只读)_Git - Fatal编程技术网

git不遵守core.sharedRepository=group(git推送后文件只读)

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)是在创建、克隆和推送多个更改后设置的 我看到的问

我在本地网络上有一个共享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,但如果我能在第一时间阻止这种情况发生,那就太好了

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
进程使用umask
077
、“组”和“其他”运行无论进程在调用
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)
$