如何从Git的未分级更改中删除“旧模式100755新模式100644”文件?


723

由于某种原因,当我最初从存储库中提取一个我的git项目时,我在工作副本中得到了很多文件,这些文件没有明显的变化,但仍在我的unstaged changes区域中显示。

我在Windows XP上使用Git Gui,当我去查看文件以查看发生了什么变化时。我所看到的是:

old mode 100755  
new mode 100644  

有人知道这意味着什么吗?

如何将这些文件从未进行的暂存更改列表中删除?(非常烦人,必须浏览100多个文件,只是挑选我最近编辑并想要提交的文件)。

Answers:


1284

在我看来,这似乎是unix文件许可权模式(755= rwxr-xr-x644= rw-r--r--)-旧模式包括+ x(可执行)标志,新模式则没有。

此msysgit问题的答复建议将core.filemode设置为false,以消除该问题:

git config core.filemode false

132
+1。这意味着git认为它可以在检出的文件上正确设置可执行位,但是当它尝试这样做时,它就不起作用(或者至少不能以可读取的方式)。然后,当它回读那些文件的状态时,可执行位似乎已经被故意取消了。将core.filemode设置为false会告诉git忽略文件系统上的任何可执行位更改,因此它不会将其视为更改。如果确实需要进行可执行位更改,则意味着您必须手动执行git update-index --chmod=(+|-)x <path>
CB Bailey

7
如果像我一样,模式更改很重要,则可以将core.filemode设置为false,提交实际的代码更改,然后将core.filemode设置为true,而git将保留文件更改。
迈克尔·史密斯,

8
我有同样的问题,但这是由于通过SSH git cmd行和Windows映射驱动器上的Git Extensions使用了相同的git repro!。。解决方案相同,添加到“ config”中[core] filemode = false
Ian Vaughan 2010年

2
那是救命的人,谢谢您,先生!在我共享公用文件夹上的一个克隆存储库并更改了文件的权限之后,这在OSX上发生了。
Thiago Ganzarolli 2011年

8
@robsch您可以用来git config --global ...在全局配置文件中设置选项。
2015年

98

设置core.filemode为false确实可以,但是请确保中的设置~/.gitconfig不会被中的设置覆盖.git/config


3
去过也做过。遗憾的是,只有在我自己解决问题后,我才能找到您的评论。不过,+ 1!
David Schmitt'2

1
如果其他用户正在Windows上克隆此项目,则最好将更改实际上应用于~/.gitconfig文件!
伊恩·沃恩

如果要检查Windows Powershell。git config --list --show-origin | sls filemode或在Linux上git config --list --show-origin | grep filemode。这将显示您需要进行调整的地方。
Frank Fu

你钉了!做得好。

27

当从旧硬盘驱动器复制带有工作文件的git repo几次时,遇到了这个问题。问题源于所有者和权限从旧驱动器/计算机更改为新驱动器/计算机的事实。总而言之,请运行以下命令以理顺一切(由于此超级用户的回答):

sudo chmod -R -x . # remove the executable bit from all files

前一个命令实际上将解决git diff报告的差异,但是将撤消您列出目录的功能,因此ls ./失败ls: .: Permission denied。要解决此问题:

sudo chmod -R +X . # add the executable bit only for directories

坏消息是,如果您有任何要保留可执行文件的文件(例如.sh脚本),则需要还原这些文件。您可以使用以下命令为每个文件执行此操作:

chmod +x ./build.sh # where build.sh is the file you want to make executable again

2
谢谢,对我帮助很大!还应该检查将git config core.filemode其设置为true,否则将不会检测到权限更改。我还需要在每次更改后刷新git索引以将其选中。
拍拍-S

如果您担心受影响的依赖项,此解决方案是最安全的。

9

通常在Windows和Linux / Unix计算机之间克隆仓库时发生。

只是告诉git忽略文件模式更改,这有几种方法:

  1. 仅配置当前回购:

    git config core.filemode false
    
  2. 全局配置:

    git config --global core.filemode false
    
  3. 添加〜/ .gitconfig:

    [core]
         filemode = false
    

只需选择其中之一。


全局配置不起作用,因为(我猜)git将此选项设置为true时创建了一个回购(我在Linux中创建了一个回购)
Herrgott

4

看来您已经更改了目录的某些权限。我执行了以下步骤来还原它。

$  git diff > backup-diff.txt                ### in case you have some other code changes 

$  git checkout .

3

您可以尝试git reset --hard HEAD将存储库重置为预期的默认状态。


8
如果git在拉取后无法正确/一致地设置可执行位,那么在重置后它不会变得更好。
CB Bailey 2009年

2
我将一些项目移到了USB驱动器(fat32),然后又移回了我的ubuntu计算机(ext4),最后得到了一堆更改的文件,以及属性。git reset --hard HEAD对我来说效果很好。谢谢
cirovladimir 2014年

7
-1。OP指出“只是挑选我最近编辑过并想要提交的文件”。这也将删除这些编辑。
whitfin 2014年

9
-1在git中建议此命令类似于说“您可以rm -rf ./,我确定它不会有任何意想不到的后果”。
Kzqai 2015年

1
不,这没有帮助,这就是问题所在。您重置并清理后,git状态仍然显示模式更改。这是Windows git的一个严重问题,我认为应该修复它,而不仅仅是通过忽略文件模式来解决。
vezenkov


1

当您提取并且所有文件在远程存储库中都是可执行文件时,就会发生这种情况。使它们再次可执行将使所有设置再次恢复正常。

chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder

您可能需要做:

chmod -x <file> // Removes execute bit

相反,对于未设置为可执行文件且由于上述操作而被更改的文件。有一种更好的方法可以做到这一点,但这只是一个非常快速和肮脏的解决方法。


1

您可以使用以下命令将文件模式更改回原来的状态。 git add --chmod=+x -- filename 然后提交到分支。


0

我只有一个麻烦的文件,但权限已更改。要单独回滚,我只是使用手动将其删除rm <file>,然后进行了检出以提取新副本。

幸运的是我还没有上演过。

如果可以的话,我可以git reset -- <file>先跑步git checkout -- <file>


0

与分支机构进行区分时,我只是遇到了这个问题。当我期望我的分支与master相同时,Git返回了一个“模式”错误。我通过删除文件然后重新合并master来进行修复。

首先,我运行了差异:

git checkout my-branch
git diff master

这返回:

diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644

然后,我运行以下命令进行修复:

rm bin/script.sh
git merge -X theirs master

此后,git diff我的分支机构和主分支之间没有任何区别。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.