移动代码仓库后,使用git diff报告模式更改

26

我把许多Git存储库通过复制到外部硬盘移动到了另一个操作系统。现在,当我执行 git diff 命令时,它会报告所有文件的模式都已更改。

diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/.npmignore b/.npmignore
old mode 100644
new mode 100755
diff --git a/.travis.yml b/.travis.yml
old mode 100644
new mode 100755
diff --git a/LICENSE b/LICENSE
old mode 100644
new mode 100755
diff --git a/README.md b/README.md
old mode 100644
new mode 100755

我对文件权限不是很了解,我应该怎么做?

提交模式更改?将所有非可执行文件的模式改回去?git reset?


从哪个操作系统到哪个操作系统? - Michael Durrant
@fent - 你能否请审查一下被接受的答案,注意第二个答案的赞数和简洁性。 - Ross Attrill
两个答案不同。尽管第二个更简单,但它涉及关闭文件模式跟踪,这可能并不适用于所有存储库。 - fent
2个回答

52
你可以应用此设置:git config core.filemode false,使Git忽略文件模式的差异。
该解决方案来自@kan在另一个问题的答案中。请注意保留HTML标记。

3
@DeaDEnD 这个回答在我看来应该被标记为正确的答案,也许值得在问题中提到? - Nitsan Wakart
1
非常感谢!其他建议,如更改文件的行尾格式、设置crlf配置、硬重置等都没有起作用。这个方法非常有效。 - Nagabhushan S N

11

可能您的外置硬盘使用了不同的文件系统,未能保留原来的文件权限。在提交之前,建议手动纠正这些权限问题。

例如,FAT32是常用于USB闪存驱动器的文件系统,它不支持执行权限。当您将文件从FAT32文件系统复制到普通的类Unix文件系统时,通常会为所有文件设置执行权限,因为这样比关闭所有文件的执行权限更安全。

如果您想保留这种类型的信息,请不要直接将文件复制到驱动器上;相反,可以创建一个tar文件(可选压缩),然后在另一端解压缩。 tar格式确实会跟踪Unix权限位。

请注意,Git本身只跟踪可执行和不可执行文件之间的差异。如果只有权限更改是唯一的差异,并且您不想重新复制所有内容,可以将git diff的输出转换为脚本,对所有受影响的文件执行chmod -x操作。


如果是这种情况,我会考虑用其他方式重新传输它们。我想把所有文件压缩成一个文件。绝不会手动纠正所有这些文件。 - fent
或者使用更智能的文件系统重新格式化您的外部磁盘。您从哪个文件系统转换到哪个文件系统?外部磁盘是什么格式? - Carl Norum
1
从 ext4 到 ntfs,外部文件系统的转换。 - fent
4
如果所有文件都是+x,您只需运行 git diff --name-only | xargs chmod -x 命令,从所有修改过的文件中移除执行位。一个更加细致和全面的方法是使用 这个答案 中提供的命令,该命令专门处理模式更改(包括 +x 和 -x)。 - johnny

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