将新文件夹/文件推送到共享仓库时,Git 将创建模式设置为 100664

标签 git

我和我的同事有一个共享的网站存储库。我们都在 Windows 7 64 位上推送到 Ubuntu 10.04。以下是我们的设置,以防出现问题。

本地->中心->网站

我们推送到集线器,这是一个裸仓库,然后在集线器 cd 中使用更新后 Hook 到网站仓库,并将更改从集线器 pull 到网站。这样做是因为该网站是实时的,并且始终处于 checkout 状态,无法推送到。

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

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

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

在共享存储库中,我们有 core.sharedrepository = 0660,我认为这意味着它会根据需要设置权限。我们的 .bashrc 中的 umask 也设置为 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

最佳答案

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

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

因为您已经有了更新后 Hook 来检查网络服务器中的存储库,我建议在那里添加一个 chmod 脚本。有点像

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

编辑:我非常确信您的 ssh/git 服务器的 umask 与交互式登录时的不同。也许您应该在更新后 Hook 的开头明确设置 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

关于将新文件夹/文件推送到共享仓库时,Git 将创建模式设置为 100664,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14325186/

相关文章:

git push挂掉导致网络问题

git - 如何在 Vim 中刷新 git diff 输出

linux - 在 vim 中执行打开默认编辑器命令

git rebase - rebase 与 develop 和 origin/develop 之间的区别?

Git 日志表格格式

git - 将 master merge 到分支后,master 包含分支的更改

Windows 自定义 git 命令

git - 如何将 develop 分支中的 git commits merge 到 feature 分支

git - 如何解析 GIT 提交中的注释?

python - git graph父子表格格式