5

我和我的同事有一个共享的网站回购。我们都在 Windows 7 64 位推送到 Ubuntu 10.04。以下是我们的设置,以防万一。

本地->集线器->网站

我们推送到集线器,这是一个裸仓库,然后使用集线器 cds 中的更新后挂钩到网站仓库,并将更改从集线器拉到网站。这样做是因为该网站是活动的,并且始终签出并且无法推送到。

当我在本地并提交一个新文件夹/文件时,它使用 100644 的创建模式说明以下内容

$ git commit -a -m "testing permissions"
[master 865b809] testing permissions
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 test.php

当我将这些更改推送到存储库时,它会将文件夹创建为 755,当我需要它们为 775 和 664 时将文件创建为 644。只要我只编辑文件,权限至少保持不变。唯一的问题在于创作。

在我们拥有的共享存储库中core.sharedrepository = 0660,我认为这意味着它将根据需要设置权限。我们的umaskin our.bashrc也设置为 002。

这是我的本地配置

[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly

似乎我们的本地人正在确定权限并忽略我们共享存储库上的设置。如何将创建模式设为 100664。

编辑

集线器配置

[core]
repositoryformatversion = 0
filemode = true
bare = true
sharedrepository = 0660
[receive]
denyNonFastforwards = true

网站配置

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
sharedrepository = 1
[receive]
denyNonFastforwards = true

编辑2

正如下面的 Kalle Pokki 在她的评论中指出的那样。这个问题是,当使用 GIT 并推送它时,它是以非交互方式运行的,所以我的 umask 设置不起作用。我已经更新了我的 repo 的更新后,以将 umask 设置为0002每次有人推送时。

4

2 回答 2

3

据我所知,git 不会将文件权限存储在您想要的级别。拥有 644 或 664 个文件完全取决于 umask。

core.sharedrepository 只处理 git 数据库的文件权限,不处理存储在存储库中的文件的权限。

由于您已经有更新后挂钩来检查 Web 服务器中的存储库,我建议在那里添加一个 chmod 脚本。就像是

find /path/to/website -type d | xargs chmod 775
find /path/to/website -type f | xargs chmod 664

编辑:我很有信心您的 ssh/git 服务器的 umask 与交互式登录时的不同。也许您应该在更新后挂钩的开头明确设置 umask。请参阅以下内容,其中我在主分支中不存在的 tmp 分支中有附加文件“1”:

$ umask 0022
$ git checkout tmp
Switched to branch 'tmp'
$ ls -l 1
-rw-r--r-- 1 kp kp 5 2013-01-15 15:53 1
$ git checkout master
Switched to branch 'master'
$ umask 0002
$ git checkout tmp
Switched to branch 'tmp'
$ ls -l 1
-rw-rw-r-- 1 kp kp 5 2013-01-15 15:53 1
于 2013-01-15T08:20:31.743 回答
2

这是由您的 filemode=false 引起的

参考http://www.gelato.unsw.edu.au/archives/git/0609/28190.html

如果 filemode=0,则添加文件时忽略可执行位。

如果用户配置了 core.filemode=0,那么我们不应该在添加新文件时在索引中设置执行位,因为用户已经表明本地文件系统不可信。

这意味着当在 core.filemode=0 的存储库中添加应该标记为可执行的文件时,用户必须在提交添加之前对文件执行“git update-index --chmod=+x”。

签字人:Shawn O. Pearce 签字人:Junio C Hamano

于 2014-02-20T05:53:01.603 回答