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

时间:2009-08-10 22:30:04

标签: git git-gui

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

我在Windows xp上使用Git Gui,当我去查看文件以查看更改内容时。 我只看到了:

old mode 100755  
new mode 100644  

有谁知道这意味着什么?

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

14 个答案:

答案 0 :(得分:1105)

这看起来像我的unix文件权限模式(755 = rwxr-xr-x644 = 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忽略文件模式更改,这有几种方法:

  1. 仅为当前存储库配置:

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

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

    [core]
         filemode = false
    

只需选择其中之一。

答案 12 :(得分:0)

这对我有用:

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

答案 13 :(得分:0)

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

  1. 看看您的回购文件的文件权限: git ls-files --stage

  2. 如果您希望100755并希望100644

然后运行以下命令: git ls文件--stage | sed's / \ t / / g'|切-d''-f4 | xargs git update-index --chmod = -x

  1. 现在再次检查您回购文件的文件权限: git ls-files --stage

  2. 现在提交更改:

git状态

git commit -m“已恢复适当的文件权限”

git push