我最近将我的编程内容从本地存储移动到网络存储。从那时起,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机器上。
我使用了挂载选项noperm
,file_mode
,dir_mode
,但却无法使用它。
我读到git config core.filemode false
,但我不确定这是否正确。我害怕损坏我的存储库。
Git是否在存储库/索引中保存权限信息?我能以某种方式检查吗?也许我已经对我的最近提交做了一些错误。
答案 0 :(得分:1)
您不能跨操作系统边界使用Git,也可能在Samba / CIFS期间使用Git,因为它会强制在新文件和修改过的文件上使用文件掩码。请参阅Atlassian网站上的this 2013 discussion。几年前,我希望通过Samba地图在我的本地开发服务器(本地系统上的Ubuntu VM实例)上的Git仓库中使用Windows SourceTree,但事实并非如此。我仍然使用虚拟机作为开发服务器,因为我发现在Windows中使用不能设计在其中运行的环境非常令人沮丧,更不用说生产环境总是Linux。当然,开发工具在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中的相关帖子。