【问题标题】:Git diff reports local changes 'old mode' / 'new mode'Git diff 报告本地更改“旧模式”/“新模式”
【发布时间】:2011-07-22 10:59:17
【问题描述】:

有 2 台机器,A 和 B。并且有 2 个分支,p16 和 c2。

A 有一个 ext3 文件系统,但在 B 上,存档位于带有 vfat 的 truecrypt 驱动器上,mount 显示 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 忽略了更改的文件?
  • p16 有 2 行的 gitignore,请参阅更新后的问题
  • 您在 Windows 上吗?它缺少x 位,这会导致您描述的很多痛苦。
  • 你推送到非裸仓库?
  • 您的操作系统可能在文件权限方面做了一些有趣的事情;尝试在 .git/config 中设置 filemode=false ,这将告诉 git 忽略它正在跟踪的文件的可执行位。

标签: git filesystems file-permissions


【解决方案1】:

如果操作系统的文件权限在该位置没有正常运行,则使用 git 可能会出现此类问题。例如,当挂载外部文件系统时。

meagar 在对上述问题的评论中指出了解决方案:

只要确保你有(在[core] 部分内)一行

filemode=false

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

做同样事情的另一种方法是转到终端中 git repo 的根目录并输入:

git config core.filemode false

请注意,有时需要更改此设置,否则最好保持默认行为。在许多情况下,git 正确跟踪文件权限非常重要,这样您的项目才能正常工作。

【讨论】:

  • 这似乎很危险。这也绝对超出了我的知识范围。在 git 中这样做可能会产生什么影响?
猜你喜欢
  • 2013-05-20
  • 2018-01-07
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
相关资源
最近更新 更多