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

出于某种原因,当我最初从我的git项目的存储库中提取时,我的工作副本中有很多文件没有明显的更改,但一直出现在我的unstaged changes区域。

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

old mode 100755new mode 100644

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

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

293505 次浏览

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

这个msysgit问题的回复建议将core.filemode设置为false以摆脱问题:

git config core.filemode false

你可以试试git复位--hard HEAD将存储库重置为预期的默认状态。

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

您似乎更改了目录的某些权限。我执行了以下步骤来恢复它。

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

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

幸运的是,我还没有上演它。

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

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

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

你可能需要做:

chmod -x <file> // Removes execute bit

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

我在从旧硬盘驱动器复制带有工作文件的git存储库几次时遇到了这个问题。问题源于所有者和权限从旧驱动器/机器更改为新驱动器/机器的事实。总而言之,运行以下命令来解决问题(多亏了这个超级用户的回答):

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

我只是在将我的分支与master分开时遇到了这个问题。当我期望我的分支与master相同时,Git返回了一个“模式”错误。我通过删除文件然后再次合并master来修复。

首先我运行了diff:

git checkout my-branchgit diff master

返回:

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

然后我运行以下内容来修复:

rm bin/script.shgit merge -X theirs master

在这之后,git diff返回my-分支和master之间没有差异。

我也遇到过同样的问题。这救了我的命:

这将把所有权限恢复为diff的内容,因此除了您对文件所做的更改外,您什么都没有。

https://gist.github.com/jtdp/5443498

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

更多细节https://stackoverflow.com/a/4408378/450383

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

当存储库在Windows和Linux /Unix机器之间克隆时,通常会发生这种情况。

只需告诉git忽略文件模式更改。以下是几种方法:

  1. 仅为当前仓库配置:

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

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

     [core]filemode = false

只需选择其中一个。

core.filemode设置为false会告诉git忽略文件系统上的任何可执行位更改,因此它不会将此视为更改。如果您确实需要在将来的任何时候为此存储库执行可执行位更改,则必须手动执行,或将core.filemode设置回true。

如果所有修改后的文件都应该具有模式100755,则不太重要的替代方案是执行以下操作

chmod 100755 $(git ls-files --modified)

它只是完全改变了模式,不多不少,没有额外的影响。

(在我的情况下,这是由于OneDrive与我在MacOS上的文件系统同步;通过不更改core.filemode,我保留了模式更改可能在未来再次发生的可能性;在我的情况下,我想知道它是否再次发生,更改core.filemode将对我隐藏它,这是我不想要的)

这对我有效:

git ls-files -m | xargs -L 1 chmod 644

此解决方案将git文件权限从100755更改为100644,并将更改推送回bit桶远程存储库。

  1. 看看你的repo的文件权限:git ls文件

  2. 如果100755而你想要100644

然后运行此命令:git ls-文件--阶段|se's/\t/ /g'|切-d'-f4|xargs git update-index--chmod=-x

  1. 现在再次检查存储库的文件权限:git ls文件

  2. 现在提交您的更改:

git状态

git提交-m"恢复正确的文件权限"

git推送

这就像bkm发现的一样,但它也会考虑任何已删除的文件,并且只会在应用更改时发出警告。

这可以很好地恢复以前提交的文件模式设置。

git diff -p --no-ext-diff --no-color --diff-filter=d | grep -E "^(diff|old mode|new mode)" | sed -e "s/^old/NEW/;s/^new/old/;s/^NEW/new/" | git apply

如果有任何已删除的文件,上面的许多解决方案都会崩溃。

这将列出仅修改而未删除的文件,并将它们全部更改为755

git diff-files --name-only --diff-filter=d | xargs -L 1 chmod 755