Git diff报告本地更改“旧模式”/“新模式”

6
有两台机器,A和B。有两个分支,p16和c2。
A拥有一个ext3文件系统,但是在B上存档存在于一个truecrypt驱动器中,使用vfat格式,挂载显示rw,uid=1000,gid=1000,umask=077。
A使用sshfs将B的目录树链接到自己的目录树中,然后通过文件系统将A推送到B的p16中。
现在存在一些权限问题:
B$ git status
# On branch p16
nothing to commit (working directory clean)
B$ git checkout c2
Switched to branch 'c2'
B$ git checkout p16
error: You have local changes to 'help.txt'; cannot switch branches.

现在,git diff向我展示了所有文件的更改模式:

B$git diff
diff --git a/help.txtt b/help.txt
old mode 100644
new mode 100755
diff --git a/169.txt b/169.txt
old mode 100644
new mode 100755
... 
(a list with all files having their mode changed follows)
...

我猜问题出在本地文件系统是vfat truecrypt容器,而该文件系统不允许另一台机器所期望的权限。你有什么更好的方法来连接这两台拥有不同文件系统的机器吗?

只是猜测,分支p16是否有一个.gitignore文件,忽略了那些有更改的文件? - coreyward
p16有一个包含两行的.gitignore文件,请查看更新后的问题。 - mit
1
你使用的是Windows系统吗?它缺少一个“x”位,这会导致很多痛苦,就像你所描述的那样。 - Ben Jackson
5
你的操作系统可能会对文件权限进行一些奇怪的操作。尝试在 .git/config 文件中设置 filemode=false,这将告诉 Git 忽略它正在跟踪的文件的可执行位。 - user229044
我如何从Git的未暂存更改中删除显示为“旧模式100755新模式100644”的文件? - LF00
显示剩余3条评论
2个回答

16

如果操作系统的文件权限在特定位置没有正常工作,就会出现使用Git时遇到的问题。例如,当挂载外部文件系统时。

解决方案由meagar在上面的问题评论中指出:

只需确保您在[core]部分中有以下行:

filemode=false

在.git/config文件中,可以告诉git忽略它正在跟踪的文件的可执行位。

另一种做法是进入终端中 git 仓库所在的根目录并输入:

git config core.filemode false

请注意,有时候需要更改此设置,但通常最好保持默认行为。在许多情况下,Git正确跟踪文件权限非常重要,以便您的项目可以正常工作。


1
这似乎很危险。这也绝对超出了我的知识范围。在git中这样做可能会有什么后果? - dudewad

3

我的Ubuntu安装系统损坏了,所以我不得不完全重新安装22.04(果冻鱼)。

我备份了大量的git仓库(各种类型的项目,包括C#、HTML / JS等),然后进行了恢复。我发现许多文件现在被设置为755(可执行文件),而它们原来是644。

old mode 100644
new mode 100755

由于没有其他更改,这些文件也被错误地设置为exe。我只需使用以下命令再次检出原始文件:

$ git checkout .

这将再次检出主分支代码,并将文件模式恢复为644。


1
一样。当我更换我的 Mac 笔记本电脑时,我使用 rsync 将我的 git 项目备份到了一个外部 SSD 中。将它们恢复到新的笔记本电脑后,发现有许多已暂存的文件。使用 git checkout . 命令解决了这个问题。 - PsyGik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接