出于某种原因,当我最初从存储库中获取我的git项目时,
我的工作副本中有大量文件没有对它们进行任何可识别的更改,但仍然显示在我的unstaged changes
区域。
我在Windows xp上使用Git Gui,当我去查看文件以查看更改内容时。 我只看到了:
old mode 100755
new mode 100644
有谁知道这意味着什么?
如何从我的非暂停更改列表中获取这些文件? (非常讨厌必须通过100个文件,只是挑选我最近编辑过的文件并想要提交)。
答案 0 :(得分:1105)
这看起来像我的unix文件权限模式(755
= rwxr-xr-x
,644
= rw-r--r--
) - 旧模式包含+ x(可执行)标志,新模式没有。
This msysgit issue's replies建议将core.filemode设置为false以解决问题:
git config core.filemode false
答案 1 :(得分:84)
将core.filemode设置为false确实有效。但是你要确保〜/ .gitconfig中的设置不会被.git / config中的设置覆盖。
答案 2 :(得分:16)
在使用旧硬盘驱动器中的工作文件复制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
答案 3 :(得分:4)
您似乎已更改了目录的某些权限。我做了以下步骤来恢复它。
$ git diff > backup-diff.txt ### in case you have some other code changes
$ git checkout .
答案 4 :(得分:3)
你可以试试 git reset --hard HEAD 将repo重置为预期的默认状态。
答案 5 :(得分:1)
当您拉动并且所有文件都在远程存储库中可执行时,会发生这种情况。再次使它们可执行将使一切恢复正常。
chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder
您可能需要这样做:
chmod -x <file> // Removes execute bit
相反,对于未设置为可执行文件且由于上述操作而更改的文件。有一种更好的方法可以做到这一点,但这只是一个非常快速和肮脏的解决方案。
答案 6 :(得分:1)
我也遇到过同样的问题。这可以挽救我的生命: https://gist.github.com/jtdp/5443498
git diff -p -R --no-color \
| grep -E "^(diff|(old|new) mode)" --color=never \
| git apply
答案 7 :(得分:1)
可接受的设置git config core.filemode false
的答案有效,但会带来后果。将core.filemode
设置为false会告诉git忽略文件系统上的任何可执行位更改,因此它不会将其视为更改。如果以后确实需要为此存储库进行可执行位更改,则必须手动执行,或将core.filemode
设置为true。
如果所有修改后的文件都应具有模式100755,那么不太重要的选择是做类似的事情
chmod 100755 $(git ls-files --modified)
这只是在完全改变模式的情况下,没有更多,没有更少,而没有其他影响。
(在我的情况下,这是由于OneDrive与MacOS上的文件系统同步;通过不更改core.filemode
,我保留了将来可能再次发生模式更改的可能性;的情况下,我想知道它是否再次发生,并且更改core.filemode
会对我隐藏,这是我不想要的)
答案 8 :(得分:0)
我只有一个带有更改权限的麻烦文件。
要单独回滚,我只需用rm <file>
手动将其删除,然后进行结帐以获取新的副本。
幸运的是我还没有上演。
如果我有,我可以在运行git reset -- <file>
git checkout -- <file>
答案 9 :(得分: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之间没有返回任何差异。
答案 10 :(得分:0)
您可以使用以下命令将文件模式改回原来的状态。
git add --chmod=+x -- filename
然后提交到分支。
答案 11 :(得分:0)
通常是在Windows和Linux / Unix计算机之间克隆仓库时发生的。
只需告诉git忽略文件模式更改,这有几种方法:
仅为当前存储库配置:
git config core.filemode false
全局配置:
git config --global core.filemode false
添加〜/ .gitconfig:
[core]
filemode = false
只需选择其中之一。
答案 12 :(得分:0)
这对我有用:
git ls-files -m | xargs -L 1 chmod 644
答案 13 :(得分:0)
此解决方案会将git文件的权限从100755更改为100644,并将更改推送回bitbucket远程存储库。
看看您的回购文件的文件权限: git ls-files --stage
如果您希望100755并希望100644
然后运行以下命令: git ls文件--stage | sed's / \ t / / g'|切-d''-f4 | xargs git update-index --chmod = -x
现在再次检查您回购文件的文件权限: git ls-files --stage
现在提交更改:
git状态
git commit -m“已恢复适当的文件权限”
git push