配置Git,以便为文件提供正确的权限

时间:2015-05-19 19:09:09

标签: git permissions file-permissions

我正在和一个团队一起使用Git。我们已经建立了一个裸存储库,我们将其视为私有* nix服务器上的“中央”存储库。

为了确保只有我的协作者和我可以使用存储库,我在服务器上为我们创建了一个用户组:

$ mkgrp ourproject

然后在服务器上创建一个简单的Git仓库,正确设置其权限和组:

$ newgrp ourproject # Create new files as the correct group
$ umask 007 # Members of the group and I can do anything to the files; no one else can
$ git init --bare
$ ls -l
drwxrwx---  2 knorth ourproject  2 May 13 16:15 branches
-rwxrwx---  1 knorth ourproject 66 May 13 16:15 config
-rwxrwx---  1 knorth ourproject 73 May 13 16:15 description
-rwxrwx---  1 knorth ourproject 23 May 13 16:15 HEAD
drwxrwx---  2 knorth ourproject 10 May 13 16:15 hooks
drwxrwx---  2 knorth ourproject  3 May 13 16:15 info
drwxrwx--- 15 knorth ourproject 15 May 18 20:48 objects
drwxrwx---  4 knorth ourproject  4 May 13 16:15 refs

到目前为止,非常好。

但是,每当我推送到Git存储库时,存储库中新对象的权限都设置为-r--------而不是-rwxrwx---,正如我预期的那样。此外,新文件将分配给名为grad的组,这是我所属的其他组之一,而不是ourproject组。

在我的本地计算机上,我推动了更改:

Kevins-MacBook-Pro:cloned-repo ThePondermatic$ git push
Password: 
Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (9/9), 111.01 KiB | 0 bytes/s, done.
Total 9 (delta 0), reused 0 (delta 0)
To knorth@server.net:/home/repo/location
   11fb73c..d9c0db4  master -> master

然后,在服务器上:

$ ls -lR # Show the permissions for all files in the bare repo
.:
total 20
drwxrwx---  2 knorth ourproject  2 May 13 16:15 branches
-rw-rw----  1 knorth ourproject 66 May 13 16:15 config
-rw-rw----  1 knorth ourproject 73 May 13 16:15 description
-rw-rw----  1 knorth ourproject 23 May 13 16:15 HEAD
drwxrwx---  2 knorth ourproject 10 May 13 16:15 hooks
drwxrwx---  2 knorth ourproject  3 May 13 16:15 info
drwxrwx--- 15 knorth ourproject 15 May 18 20:48 objects
drwxrwx---  4 knorth ourproject  4 May 13 16:15 refs

./branches:
total 0

./hooks:
total 26
-rwxrwx--- 1 knorth ourproject  452 May 13 16:15 applypatch-msg.sample
-rwxrwx--- 1 knorth ourproject  896 May 13 16:15 commit-msg.sample
-rwxrwx--- 1 knorth ourproject  189 May 13 16:15 post-update.sample
-rwxrwx--- 1 knorth ourproject  398 May 13 16:15 pre-applypatch.sample
-rwxrwx--- 1 knorth ourproject 1704 May 13 16:15 pre-commit.sample
-rwxrwx--- 1 knorth ourproject 1239 May 13 16:15 prepare-commit-msg.sample
-rwxrwx--- 1 knorth ourproject 4951 May 13 16:15 pre-rebase.sample
-rwxrwx--- 1 knorth ourproject 3611 May 13 16:15 update.sample

./info:
total 2
-rw-rw---- 1 knorth ourproject 240 May 13 16:15 exclude

./objects:
total 39
drwx--x--x 2 knorth grad       3 May 13 16:18 11
drwx--x--x 2 knorth grad       3 May 13 16:18 21
drwx--x--x 2 knorth grad       3 May 18 20:48 4b
drwx--x--x 2 knorth grad       3 May 18 20:48 65
drwx--x--x 2 knorth grad       3 May 18 20:48 69
drwx--x--x 2 knorth grad       3 May 18 20:48 7e
drwx--x--x 2 knorth grad       3 May 18 20:48 87
drwx--x--x 2 knorth grad       3 May 18 20:48 cd
drwx--x--x 2 knorth grad       3 May 18 20:48 d6
drwx--x--x 2 knorth grad       4 May 18 20:48 d9
drwx--x--x 2 knorth grad       3 May 13 16:18 e3
drwxrwx--- 2 knorth ourproject 2 May 13 16:15 info
drwxrwx--- 2 knorth ourproject 2 May 13 16:15 pack

./objects/11:
total 2
-r-------- 1 knorth grad 138 May 13 16:18 fb73c05ea22ab9c90a93795fb3f9c2797d0fea

./objects/21:
total 2
-r-------- 1 knorth grad 62 May 13 16:18 ed7bc969b55a4bf57da33c868ac3b61f94d75b

./objects/4b:
total 2
-r-------- 1 knorth grad 148 May 18 20:48 626af7d3bd4d8874899fca47498ccb40279dde

./objects/65:
total 2
-r-------- 1 knorth grad 125 May 18 20:48 82534615eb3f6b54114d8649cf68d8af15aa8b

./objects/69:
total 21
-r-------- 1 knorth grad 20518 May 18 20:48 4a8974a043e616448faa43bfe38a627738436a

./objects/7e:
total 3
-r-------- 1 knorth grad 1781 May 18 20:48 9e723b7b9f19170d93c4561592de6a9493cc6e

./objects/87:
total 2
-r-------- 1 knorth grad 61 May 18 20:48 27591210bd17c85f46f9fde043fe8cd25c11b0

./objects/cd:
total 2
-r-------- 1 knorth grad 153 May 18 20:48 327eec7c8f0a310a6da1283212679cc3baa229

./objects/d6:
total 2
-r-------- 1 knorth grad 63 May 18 20:48 a2be2b03ed954b5aa80349357e2b5a185122dd

./objects/d9:
total 94
-r-------- 1 knorth grad 93619 May 18 20:48 9733e331131b8bfccc817442bbd1959a8d37fb
-r-------- 1 knorth grad   387 May 18 20:48 c0db4b3d0309bea0370baeb9781994894fd16e

./objects/e3:
total 3
-r-------- 1 knorth grad 802 May 13 16:18 0616da1903944069de5b4d6d64c1ac0dead823

./objects/info:
total 0

./objects/pack:
total 0

./refs:
total 6
drwxrwx--- 2 knorth ourproject 3 May 18 20:48 heads
drwxrwx--- 2 knorth ourproject 2 May 13 16:15 tags

./refs/heads:
total 2
-rw------- 1 knorth grad 41 May 18 20:48 master

./refs/tags:
total 0

请注意,objects目录中的大多数文件现在具有-r--------权限,属于grad组。这不是我期望的行为,这意味着每当我的协作者从回购中尝试git pullgit clone时,他们都会收到以下错误:

fatal: '/home/repo/location' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

如何配置Git存储库或存储它的* nix环境,以便:

  1. 通过推送更改添加到存储库的所有新文件都分配了文件的-rwxrwx---权限和文件夹的drwxrwx---权限,
  2. 通过推送更改添加到存储库的所有新文件都分配到ourproject组而不是grad组?

1 个答案:

答案 0 :(得分:1)

所有权取决于包含git存储库的文件系统。不同的服务器根据不同的标准分配组ID。一种常见的方法是始终使用包含目录的组ID;另一种是始终使用创建过程的主要组ID;第三种折衷方法根据包含目录的setgid位选择使用哪种方法。例如,请参阅this description for Linux。您可能想要设置" setgid"包含裸存储库的目录位(使用此位的系统会自动将设置传播到新目录,否则使用起来会非常痛苦。)

群组写入权限由git' core.sharedRepository设置控制。有关详细信息,请参阅git-config documentation,但简而言之,您希望将其设置为grouptrue。这主要用于git存储库中的容器目录(例如objects/objects/a7/refs/等)(见下文)。

每个源控制文件的执行位是按文件设置的,并由git根据文件在添加到索引时的权限设置。如果此时设置了任何执行位,则文件将存储为mode 0755,否则将存储为mode 0644。 (更改模式并重新添加文件将使您更改&#34;模式已更改,未更改内容和#34;差异指示。)虽然此看起来像<{em>} rwxr-xr-xrw-r--r--,git实际上只关心单个标志,&#34;该文件在提取时是否具有执行权限设置&#34;。决定哪个&#34; x&#34;根据用户的umask,在结账时发生要设置的位(用户,组和/或其他)。

底层对象和包文件(在.git目录内,或者更明显但在裸仓中效果相同)保持只读,并且只能根据需要临时写入(事实上,通过创建一个新文件,将所有新数据写入新文件,然后交换文件&#34;使用rename获取原子性 - 这个新文件创建是组所有权的原因如果存储库由组权限共享,则目录权限很重要。将git数据库文件保持为只读可能会阻止意外覆盖。 (同样的只读规则是 not 应用于refs/heads/master等文件,可能是因为在git的早期,这些文件是直接用echo命令等编写的,而不是花哨的创建 - 写 - 重命名技巧。)

没有理由让配置文件可执行,而git只是不会这样做。

挂钩的权限由设置挂钩的人设置。 Git根本没有改变它们(也没有源代码控制它们),它只是检查钩子是否可以运行:如果可以,它就是。