如何在Git的未暂存更改中删除文件,提示为“旧模式100755新模式100644”?

983
由于某种原因,当我最初从git存储库中进行拉取时,我的工作副本中出现了大量文件,这些文件没有可辨别的更改,但仍然出现在我的"未暂存的更改"区域中。
我在Windows XP上使用Git Gui,当我查看文件以查看发生了什么变化时,我只看到:
old mode 100755  
new mode 100644  

有人知道这是什么意思吗?

我该如何将这些文件从我的未暂存更改列表中移除?(必须要浏览几百个文件,才能挑选出最近编辑并想要提交的文件,非常烦人)。


有关core.filemode的全部细节,请参见我的答案。请注意,每个Git存储库都应该有自己的core.filemode设置,在Git创建该存储库时由Git设置;该设置应该是该存储库的正确设置。如果由于某种原因它是错误的,您可以更改它。 - torek
19个回答

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

1
这类似于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

1
你可以尝试使用以下命令来将代码库重置为预期的默认状态: git reset --hard HEAD

9
如果在进行了拉取操作后,git没能正确或一致地设置可执行位,那么重置也不会更好。 - CB Bailey
3
我将一些项目移动到了一个USB驱动器(FAT32),然后再次将它们传输回我的Ubuntu机器(ext4),结果有一堆文件发生了改变,主要是它们的属性。git reset --hard HEAD 对我来说完美解决了这个问题。谢谢。 - cirovladimir
9
作者表示:“只是要挑选出我最近编辑并想提交的文件。” 这样做会同时删除这些编辑内容。 - whitfin
12
在git中建议使用这个命令就像在说“你可以只使用rm -rf ./命令,我确定它不会有任何意外后果”。 - Kzqai
2
不,这并没有帮助,这就是问题所在。你重置和清理了,但git status仍然显示模式更改。这是Windows git的一个严重问题,我认为应该修复它,而不仅仅是通过忽略文件模式来解决。 - vezenkov
显示剩余5条评论

1

如果存在任何已删除的文件,上述解决方案中的一些解决方案将失效。

此操作将列出仅已修改而未被删除的文件,并将它们全部更改为755

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

0

我在比较我的分支和主分支时遇到了这个问题。Git 返回了一个“模式”错误,但我本来期望我的分支与主分支完全相同。我通过删除文件并再次合并主分支来解决了这个问题。

首先我运行了 diff 命令:

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 没有返回我分支和主分支之间的差异。


什么是 theirs - KansaiRobot
theirs 告诉合并使用另一个分支中的版本(而不是当前分支,称为 ours)。有关 ours vs theirs 的更多信息,请参见此处 - Collin Krawll

0
如果您在Windows中使用linux devcontainer进行开发,并且使用相同的Windows和WSL版本的文件夹,您可能希望采取以下步骤:
1. 在本地仓库范围内取消设置文件模式(即在仓库文件夹层次结构中运行此命令): ``` git config --unset --local core.fileMode ```
2. 在Windows中,在全局范围内将文件模式设置为false(即在Windows的任何位置运行): ``` git config --global core.filemode false ```
3. 在容器中,在全局范围内将文件模式设置为true(即在容器的任何位置运行): ``` git config --global core.filemode true ```
现在,您将不会看到没有任何文件内容更改的修改文件。
此外,您可能希望在devcontainer.json文件的postCreateCommand选项中进行此更改,以便在重新构建容器时保持持久化。

0
执行以下命令: chmod 755 xxx 将 "xxx" 替换为文件的路径,然后希望事情能够顺利进行。该命令将权限级别从100644设置回100755。

0

我只有一个权限更改后出现问题的文件。 为了单独回滚它,我手动使用rm <file>删除了它,然后进行了检出以获取新的副本。

幸运的是,我还没有将其暂存。

如果我已经暂存了它,我可以在运行git checkout -- <file>之前运行git reset -- <file>


0

通过在WSL2中运行git,实现完全的Linux兼容性,这样就不需要在提交前后翻转core.filemode之类的解决方法。


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