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

问题描述 投票:636回答:11

出于某种原因,当我最初从存储库中获取我的git项目时,我在我的工作副本中获得了大量文件,这些文件没有对它们进行任何可识别的更改,但是仍然会出现在我的unstaged changes区域。

我在Windows XP上使用Git Gui,当我去查看文件时看看有什么变化。我只看到:

old mode 100755  
new mode 100644  

有谁知道这意味着什么?

如何从我的未分级更改列表中获取这些文件? (非常讨厌必须通过100个文件,只是挑选我最近编辑过的文件并想要提交)。

git git-gui
11个回答
1146
投票

这看起来像我的unix文件权限模式(755 = rwxr-xr-x644 = rw-r--r--) - 旧模式包括+ x(可执行)标志,新模式不包括。

This msysgit issue's replies建议将core.filemode设置为false以解决问题:

git config core.filemode false

0
投票

我刚刚与master分享我的分支时遇到了这个问题。当我希望我的分支与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没有返回my-branch和master之间的差异。


0
投票

您可以使用以下命令更改文件模式。 git add --chmod=+x -- filename然后承诺到分支机构。


87
投票

core.filemode设置为false确实有效,但请确保~/.gitconfig中的设置未被.git/config中的设置覆盖。


18
投票

我在使用旧硬盘驱动器中的工作文件复制git repo时遇到了这个问题。问题源于所有者和权限从旧驱动器/机器更改为新驱动器/机器的事实。它的长短是运行以下命令来理顺(thanks to this superuser answer):

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

4
投票

看来你已经改变了目录的一些权限。我做了以下步骤来恢复它。

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

$  git checkout .

3
投票

您可以尝试使用git reset --hard HEAD将repo重置为预期的默认状态。


1
投票

当您拉动所有文件在远程存储库中可执行时,会发生这种情况。再次使它们可执行将使一切恢复正常。

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

您可能需要这样做:

chmod -x <file> // Removes execute bit

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


1
投票

我遇到了同样的问题。这拯救了我的生命:https://gist.github.com/jtdp/5443498

git diff -p -R --no-color \ | grep -E "^(diff|(old|new) mode)" --color=never \ | git apply


1
投票

通常在Windows和Linux / Unix机器之间克隆repo时发生。

告诉git忽略filemode更改,这里有几种方法:

  1. 仅为当前回购配置: git config core.filemode false
  2. 全球配置: git config --global core.filemode false
  3. 添加〜/ .gitconfig: [core] filemode = false

只需选择其中一个即可。


0
投票

我只有一个带有更改权限的麻烦文件。为了单独回滚,我只是用rm <file>手动删除它,然后做了一个结帐以拉出一个新的副本。

幸运的是我还没有上演。

如果我有,我可以在运行git reset -- <file>之前运行git checkout -- <file>

© www.soinside.com 2019 - 2024. All rights reserved.