【问题标题】:Git wont reset file permissions over cifs mountGit 不会通过 cifs 挂载重置文件权限
【发布时间】:2016-05-05 12:48:55
【问题描述】:

我最近将我的编程资料从本地存储转移到了网络存储。从那时起,Git 就不能正常工作了。

典型场景:
我更改文件。现在我想隐藏更改。我做git stash。 Git 回滚更改。但是,这些文件在git status 中仍被标记为已更改。 git diff -p 显示

diff --git a/file.txt b/file.txt
old mode 100644
new mode 100755

我尝试通过这样做来重置文件

  • git checkout -- file.txt
  • git reset --hard

但没有任何效果。再次清理工作副本的唯一方法是发送至chmod 644 file.txt


文件位于 Synology NAS 上。我正在通过 cifs 安装到我的 Linux 机器上。 我使用了安装选项nopermfile_modedir_mode,但无法正常工作。

我读到了git config core.filemode false,但我不确定这是否是正确的做法。我害怕损坏我的存储库。 Git 是否将权限信息保存在存储库/索引中?我可以以某种方式检查吗?也许我最近的提交已经做错了。

【问题讨论】:

    标签: linux git cifs


    【解决方案1】:

    您不能跨操作系统边界使用 Git,并且可能在 Samba/CIFS 期间使用 Git,因为它会强制在新文件和修改文件上使用文件掩码。请参阅 Atlassian 网站上的 this 2013 discussion。几年前,我希望通过 Samba 映射在本地开发服务器(本地系统上的 Ubuntu VM 实例)上的 Git 存储库上使用 Windows SourceTree,但事实并非如此。我仍然将 VM 用于开发服务器,因为我发现在 Windows 中使用并非设计用于在其中运行的环境非常令人沮丧,更不用说生产环境始终是 Linux。当然,Windows 上的开发工具要好得多,所以这对我来说是“两全其美”的解决方案(虽然 Mac 端的开发工具很好,但 OSX 与 Linux 生产环境也不会是 1:1 的) .因此,我使用 Samba 映射和 a good SSH client 来处理除 Git 写入操作和可视 Git 差异(即协调变基/合并冲突)之外的所有内容,由于给定的原因,这些操作无法从 Windows 执行。当需要做 diff 时,我切换到 Linux GUI 窗口,并在那里执行the Linux GUI diff tool of choice,然后正确处理 Linux 权限。否则我使用 SSH 客户端在命令行上操作 Git。例如,您不能让 IDE 或 Windows Git 客户端(如SourceTree)通过 Samba/CIFS 向 repo 提交;它不能正常工作。对于可视化 Git 客户端,新的 GitKraken 是一个很好的选择(它在 Linux GUI 中运行)。

    某些情况下,您可以通过运行 Git 命令同时忽略文件权限(即git -c core.fileMode=false)来规避文件权限问题,但我发现这很混乱并导致麻烦,所以我有时只将它用于非写操作,例如git status,并为此定义了一个 Git 别名:

    nfm = "!f(){ git -c core.fileMode=false $@; };f"
    

    然后您可以在 core.fileMode 暂时禁用的情况下运行 Git 命令,如下所示:

    git nfm status
    

    添加于 2016-05-07T01:39:44Z:

    另请参阅我在Superuser 中的相关帖子。

    【讨论】:

      猜你喜欢
      • 2014-02-14
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 2021-05-02
      • 2014-07-04
      相关资源
      最近更新 更多