使用 git 检出文件时如何找出导致文件权限更改的原因?

2024-04-23

将文件推送到我们的服务器后,将执行以下 post-receive 挂钩:

#!/bin/sh
export GIT_WORK_TREE=/home/user/www/
git checkout -f

然而,文件变得非常奇怪600权限和文件夹700结账时。这不是我所期望的(在我们的其他服务器上我们得到644 and 755). From 这个线程 https://stackoverflow.com/questions/14557106/git-changes-my-file-permissions-upon-checkout我知道git没有设置权限,所以git不应该受到指责。我的问题是:什么是?我怎样才能找出这个问题的原因是什么?

我已经通过在结账时运行额外的脚本来修复权限来暂时解决了这个问题,但我有兴趣解决根本原因。

我正在使用 gitolite 来管理存储库,但我怀疑这就是原因。但同样,我很高兴知道我可以从哪里开始,因为此时我不确定如何调查这个问题。

根据最初的答案,我研究了服务器上的 umask 设置。这gituser(即用于上传文件的用户),umask 设置为 0002。这在以下练习中得到确认:

git@server:~$ umask
0002
git@server:~$ touch newfile
git@server:~$ ls -la newfile
-rw-rw-r-- 1 git git 0 Aug  5 10:46 newfile

额外细节:

  • 服务器端和开发端均使用Linux
  • 在本地仓库中,权限是755和644
  • 文件模式在 .git/config 中设置为 true

As in "Git 更新文件时更改默认 umask https://stackoverflow.com/a/25441170/6309“,你可以将 umask 添加到你的钩子中吗?

#!/bin/sh
umask 002
export GIT_WORK_TREE=/home/user/www/
git checkout -f

这应该将文件权限设置为 664,将目录权限设置为 775。


关于gitolite具体来说,检查umask的部分gitolite.rc file http://gitolite.com/gitolite/gitolite.html#rc:

$UMASK, 八进制, 默认0077

gitolite 使用的默认 UMASK 给出rwx------对所有存储库及其内容的权限。
想要运行 gitweb(或 cgit、redmine 等)的人意识到这是行不通的。

处理这个问题的正确方法是给这个变量一个像这样的值0027(注意语法:前导 0 是必需的),然后使运行 Web 服务器(apache、www-data 等)的用户成为 'git' group.

如果您已经安装了 gitolite,则必须手动修复现有文件(对于umask or 0027,那就是chmod -R g+rX)。这是因为umask只影响新创建文件的权限,不影响现有文件的权限。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 git 检出文件时如何找出导致文件权限更改的原因? 的相关文章

  • 作曲家转储自动加载和 git

    为了部署实用性 我们决定将供应商目录提交到 git 存储库中 一切正常 但是每次我们运行 Composer dump autoload 时 它都会修改以下文件 这非常烦人 因为它似乎并不代表文件的特定状态 每次重新运行它时它看起来都像一个随
  • 如何使用开发分支中的一行命令更新本地 master 并重新设置其基准?

    假设我正在一个名为dev那就是跟踪master 如果我想更新我的主分支 我需要经常运行这一系列命令 git checkout master git pull git checkout dev git rebase i master 当我在
  • 如何在 git log 中查看提交的 git bisect 状态?

    我正在做 git bisect 到目前为止我发现了一些好的和坏的提交 我可以通过运行来确认git bisect log 但是 如果我为我的分支运行 git loggit log graph decorate full origin mast
  • 如何在 github 中拉取请求时忽略或排除文件

    我们有 4 个分支 1 dev 2 qa 3 staging 4 master 我们要更新并添加1 dev中的CODEOWNERS文件中的一些人 2 qa到4 master的CODEOWNER文件将被保留 因为 1 dev 有 4 个审稿人
  • git:显示所有已修改的文件 - 已暂存和未暂存

    我需要一个命令给我所有修改过的文件 这包括暂存 即新添加的文件 和非暂存更改 在普通列表我可以在脚本中使用它 虽然这个问题可能听起来很熟悉 但我只找到接近我想要做的命令 git ls files m 列出 非分阶段 修改但忽略了上演的和新的
  • 两个人同时在 git 中处理一个文件[重复]

    这个问题在这里已经有答案了 可能的重复 当两个对等点同时将更改推送到同一个远程时 git 如何工作 https stackoverflow com questions 4643998 how git works when two peers
  • 执行 rebase 后,Git 提交会在同一分支中重复

    我理解 Pro Git 中提出的场景是关于变基的危险 https git scm com book en v2 Git Branching Rebasing rebase peril 作者基本上告诉你如何避免重复提交 不要对已推送到公共存储
  • Docker 错误:无法找到包 git

    我正在使用图像nginx这是基于dockerfile ubuntu 连接到 docker 容器的 shell docker exec it
  • 是否可以在一台机器上使用 GitHub 和 GitLab?

    我的账户位于GitHub and GitLab 我生成了 RSA 密钥并将其添加到我的帐户中GitLab 但现在我需要与GitHub在第二个项目上 我知道GitLab和GitHub都使用git 请告诉我是否可以在一台机器上使用 GitHub
  • Jenkins Git 参数插件无法获取标签

    詹金斯版本 1 593 Git 参数插件 0 4 0 GIT 客户端插件 1 16 1 我使用私有 git 存储库 可以通过 ssh 访问 我的构建是参数化的 git参数是TAG TO BUILD 要构建的分支是refs tags TAG
  • git 存储库中的提交次数

    我的一个为期 5 个月的项目即将结束 作为毫无意义的统计数据的粉丝 我想知道自存储库启动以来已经进行了多少次提交 我怎样才能发现这一点 Notes 我知道没有one存储库 我只对本地版本感兴趣 这在颠覆中是微不足道的 因为修订标识符 似乎是
  • 有没有一种简单的方法可以知道哪些文件将在下一个“git pull”中更新?

    我想知道如果我执行 git pull 哪些文件将被更新 以及希望发生的更改 is git stash git fetch git diff origin master git stash apply 答案 See here http ker
  • Git:设置仅获取远程?

    当我跑步时git remote v在我配置了远程的 Git 存储库之一中 我看到每个远程都具有获取和推送规范 git remote v
  • 如何将空目录添加到 Git 存储库?

    如何将空目录 不包含文件 添加到 Git 存储库 使目录 在存储库中 保持 几乎 空的另一种方法是创建一个 gitignore该目录中的文件包含以下四行 Ignore everything in this directory Except
  • 如何从现有的远程分支创建本地分支?

    我想从现有的远程分支 假设是远程 A 创建一个分支 然后将更改提交到存储库 我已使用以下命令从现有的远程 A 创建本地分支 git checkout remote A git branch master remote A 现在我已经使用以下
  • 撤消 git merge(尚未推送)

    我只是将一些更改提交到我的功能分支之一 feedback tab 然后签出 master 并将它们合并到那里 我实际上打算将它们合并到我的 开发 分支中 现在 master 领先于 origin master 其远程 17 个提交 我还没有
  • Capistrano 无法部署到远程服务器

    SOLUTION 解决方案是将以下内容添加到 production rb 的顶部 unshift File expand path lib ENV rvm path Add RVM s lib directory to the load p
  • 我的小程序需要客户端访问资源的权限的策略文件位置在哪里?

    我发现我必须编写一个策略文件来授予我的小程序权限 但我真的很困惑 我想编写一个小程序 它是一个地图查看器 我需要在运行我的小程序的客户端上保存图像图块以在本地访问图块 以获得安全地查看地图的速度和时间 这对用户有利 因此 小程序需要授予读
  • git merge,保留两者

    为了合并 我用它来 保留我的 git merge X ours foo 这是 保留他们的 git merge X theirs foo 然而 在我最近的合并中 看起来最好保留双方 Git 是否有一个 策略 来避免手动编辑文件 没有解决这些冲
  • 使用 git-cvsserver 和 CVS 工作副本获取 commitid 或“git描述”

    我有一些自动化工具可以通过以下方式访问 git 存储库cvs and git cvsserver 我希望这些工具能够看到他们签出的内容的提交 ID 这是否记录在CVS元数据目录 None

随机推荐