Git不会重置cifs mount上的文件权限

时间:2016-05-05 12:48:55

标签: linux git cifs

我最近将我的编程内容从本地存储移动到网络存储。从那时起,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是否在存储库/索引中保存权限信息?我能以某种方式检查吗?也许我已经对我的最近提交做了一些错误。

1 个答案:

答案 0 :(得分:1)

您不能跨操作系统边界使用Git,也可能在Samba / CIFS期间使用Git,因为它会强制在新文件和修改过的文件上使用文件掩码。请参阅Atlassian网站上的this 2013 discussion。几年前,我希望通过Samba地图在我的本地开发服务器(本地系统上的Ubuntu VM实例)上的Git仓库中使用Windows SourceTree,但事实并非如此。我仍然使用虚拟机作为开发服务器,因为我发现在Windows中使用不能设计在其中运行的环境非常令人沮丧,更不用说生产环境总是L​​inux。当然,开发工具在Windows上更好,所以这是两个世界中最好的"对我来说解决方案(虽然Mac端的开发工具很好,OSX在Linux生产环境中也不会是1:1)。所以我使用Samba映射和a good SSH client除了Git写操作和可视Git差异(即协调rebase / merge冲突)之外的所有其他东西,由于给定的原因无法从Windows执行。当需要做差异时,我切换到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"

然后你可以运行一个Git命令,暂时禁用 core.fileMode ,如下所示:

git nfm status

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

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