出于某种原因,当我最初从存储库中获取我的git项目时,我在我的工作副本中获得了大量文件,这些文件没有对它们进行任何可识别的更改,但是仍然会出现在我的unstaged changes
区域。
我在Windows XP上使用Git Gui,当我去查看文件时看看有什么变化。我只看到:
old mode 100755
new mode 100644
有谁知道这意味着什么?
如何从我的未分级更改列表中获取这些文件? (非常讨厌必须通过100个文件,只是挑选我最近编辑过的文件并想要提交)。
这看起来像我的unix文件权限模式(755
= rwxr-xr-x
,644
= rw-r--r--
) - 旧模式包括+ x(可执行)标志,新模式不包括。
This msysgit issue's replies建议将core.filemode设置为false以解决问题:
git config core.filemode false
我刚刚与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之间的差异。
您可以使用以下命令更改文件模式。 git add --chmod=+x -- filename
然后承诺到分支机构。
将core.filemode
设置为false确实有效,但请确保~/.gitconfig
中的设置未被.git/config
中的设置覆盖。
我在使用旧硬盘驱动器中的工作文件复制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
看来你已经改变了目录的一些权限。我做了以下步骤来恢复它。
$ git diff > backup-diff.txt ### in case you have some other code changes
$ git checkout .
您可以尝试使用git reset --hard HEAD将repo重置为预期的默认状态。
当您拉动所有文件在远程存储库中可执行时,会发生这种情况。再次使它们可执行将使一切恢复正常。
chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder
您可能需要这样做:
chmod -x <file> // Removes execute bit
相反,对于未设置为可执行文件且由于上述操作而被更改的文件。有一种更好的方法可以做到这一点,但这只是一个非常快速和肮脏的修复。
我遇到了同样的问题。这拯救了我的生命:https://gist.github.com/jtdp/5443498
git diff -p -R --no-color \
| grep -E "^(diff|(old|new) mode)" --color=never \
| git apply
通常在Windows和Linux / Unix机器之间克隆repo时发生。
告诉git忽略filemode更改,这里有几种方法:
git config core.filemode false
git config --global core.filemode false
[core]
filemode = false
只需选择其中一个即可。
我只有一个带有更改权限的麻烦文件。为了单独回滚,我只是用rm <file>
手动删除它,然后做了一个结帐以拉出一个新的副本。
幸运的是我还没有上演。
如果我有,我可以在运行git reset -- <file>
之前运行git checkout -- <file>