本文介绍了setgid位不是$ P $由混帐在`.git`文件夹中新目录pserved?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个用户弗雷德裸Git仓库设置:

I have a bare git repository setup for user fred:

/home/fred/foo.git

我已经在组中 foo.git 的每个文件设置为

$ chown -R fred:bar /home/fred/foo.git

(注意:弗雷德不是组的成员

和我已经就为每个目录的setgid foo.git

And I have set the setgid bit on for every directory in foo.git:

$ find foo.git -type d -print0 | xargs -0 chmod g+s

然而,当弗雷德提交至Git仓库,该集团是不是在一些文件preserved。

However when fred commits to the git repository, the group is not preserved in some files.

具体表现在对象目录中我看到:

Specifically in the objects directory I see:

foo.git/objects:
drwxrws--- 46 fred bar 4096 Apr  7 23:43 .
drwxrws---  7 fred bar 4096 Apr  6 17:12 ..
drwxrws---  2 fred bar 4096 Apr  6 17:11 07
drwxrws---  2 fred bar 4096 Apr  6 17:11 10
drwxrwx---  2 fred bar 4096 Apr  7 22:14 14  <--- HERE
drwxrws---  2 fred bar 4096 Apr  6 17:11 17

      ^--- HERE

请注意,在对象/ 14 的setgid 位未设置。所以因而当一个新的对象被添加到目录:

Notice that in objects/14 the setgid bit is not set. So consequently when a new object is added to that directory:

foo.git/objects/14:
drwxrwx---  2 fred bar 4096 Apr  7 22:14 .
drwxrws--- 46 fred bar 4096 Apr  7 23:43 ..
-r--r-----  1 fred fred    2595 Apr  7 22:14 95482f8..9d6bfe21

所以,现在的 95482 .. 文件没有组,它拥有团体弗雷德

So now the 95482.. file doesn't have group bar, it has group fred.

我怀疑,当弗雷德 COMMITED,混帐创建点播新目录对象/ 14 举行一个新的对象,它这样做是为了某种未知的原因,当在新的 14 目录中的的setgid 位进行设置,即使它的父目录对象的setgid 位置。

I suspect that when fred commited, git created a new directory on-demand called objects/14 to hold a new object, when it did this for some unknown reason the setgid bit on the new 14 directory was not set, even though its parent directory objects has the setgid bit set.

如果我尝试手动复制此:

If I try to reproduce this manually:

$ su fred                          # as user fred
$ mkdir test1                      # create test1 dir
$ sudo chgrp bar test1             # set group to bar
$ sudo chmod g+s test1             # set setgid bit
$ ls -l
drwxrwsr-x 2 fred bar 4096 Apr  8 21:33 test1

$ mkdir test1/test2                # create dir test1/test2
$ ls -l
drwxrwsr-x 2 fred bar 4096 Apr  8 21:35 test2

      ^--- HERE

注意在新的测试1 /测试2 $ P $的的setgid 位pserved,所以当我...

Notice the setgid bit in the new test1/test2 is preserved, so when I...

$ touch test1/test2/test3

新文件仍然是集团预期:

$ ls -l test1/test2
-rw-rw-r-- 1 fred bar 0 Apr  8 21:36 test3

为什么不混帐似乎preserve的的setgid 位时,它会在新目录的.git ?目录

Why doesn't git seem to preserve the setgid bit when it creates new directories in the .git directory?

有一些git的设置我可以解决这一问题?或者,你能解释一下是什么原因造成的?

Is there some git setting I can make to fix this? Or can you explain what is causing this?

推荐答案

原来,当您指定 core.sharedrepository 配置,混帐确实上创建的文件CHMOD()秒。这样一来,结果是,尽管文件系统类型和正确的安装选项的除了的在一个案件中,仓库主人是不是与共享组的成员。

It turns out that when you specify the core.sharedrepository config, git does chmod()s on the files it creates. That way, the result is correct despite filesystem types and mount options, except in your one case where the repository owner isn't a member of the group it's shared with.

这是坏的结果是因为Git的 CHMOD()似乎是成功的 - 你可以看到它在strace的 - 但忽略任何发行用户没有被授权问。

That bad result happens because git's chmod() appears to succeed -- you can see it in an strace -- but ignores anything the issuing user isn't authorized to ask for.

因此​​,为了避免这种情况weirdity,要做的事情是

So to avoid that weirdity, the thing to do is

git config --unset core.sharedrepository

(或不指定--shared上的init在所有),因此混帐根本不碰文件系统的默认权限。有趣的是足够的,使一切工作:

(or not specify --shared at all on the init) so git doesn't touch the filesystem's default permissions at all. Amusingly enough that makes everything work:

~/sandbox/75276/s$ find ../s.git -ls
12193569    4 drwxrws---   4 jthill   mail         4096 Apr  9 13:52 ../s.git
12193571    4 -rw-rw----   1 jthill   mail           73 Apr  8 20:40 ../s.git/description
12193572    4 -rw-rw----   1 jthill   mail           23 Apr  8 20:40 ../s.git/HEAD
12721086    4 drwxrws---   2 jthill   mail         4096 Apr  9 13:52 ../s.git/objects
12193570    4 drwxrws---   2 jthill   mail         4096 Apr  9 13:52 ../s.git/refs
12193578    4 -rw-rw----   1 jthill   mail          104 Apr  9 13:37 ../s.git/config
~/sandbox/75276/s$ cat ../s.git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
[receive]
        denyNonFastforwards = true
~/sandbox/75276/s$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 198 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/jthill/sandbox/75276/s.git
 * [new branch]      master -> master
~/sandbox/75276/s$ find ../s.git -ls
12193569    4 drwxrws---   4 jthill   mail         4096 Apr  9 13:52 ../s.git
12193571    4 -rw-rw----   1 jthill   mail           73 Apr  8 20:40 ../s.git/description
12193572    4 -rw-rw----   1 jthill   mail           23 Apr  8 20:40 ../s.git/HEAD
12721086    4 drwxrws---   5 jthill   mail         4096 Apr  9 13:53 ../s.git/objects
16777964    4 drwxrwsr-x   2 jthill   mail         4096 Apr  9 13:53 ../s.git/objects/58
16777965    4 -r--r--r--   1 jthill   mail           17 Apr  9 13:53 ../s.git/objects/58/7be6b4c3f93f93c489c0111bba5596147a26cb
16777962    4 drwxrwsr-x   2 jthill   mail         4096 Apr  9 13:53 ../s.git/objects/ab
16777963    4 -r--r--r--   1 jthill   mail           46 Apr  9 13:53 ../s.git/objects/ab/69b4abf3bb84d4e268bd42d84e4a9a5e242bd3
16777960    4 drwxrwsr-x   2 jthill   mail         4096 Apr  9 13:53 ../s.git/objects/81
16777961    4 -r--r--r--   1 jthill   mail          120 Apr  9 13:53 ../s.git/objects/81/210f2df9629e5df5f6dfa0923a2cf72369314d
12193570    4 drwxrws---   3 jthill   mail         4096 Apr  9 13:53 ../s.git/refs
12193573    4 drwxrwsr-x   2 jthill   mail         4096 Apr  9 13:53 ../s.git/refs/heads
12193574    4 -rw-rw-r--   1 jthill   mail           41 Apr  9 13:53 ../s.git/refs/heads/master
12193578    4 -rw-rw----   1 jthill   mail          104 Apr  9 13:37 ../s.git/config
~/sandbox/75276/s$ 

这篇关于setgid位不是$ P $由混帐在`.git`文件夹中新目录pserved?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-03 08:37