2009-08-10 158 views
500

由于某种原因,当我最初从存储库中为我的git项目拉动时,我在我的工作副本中有大量文件没有对它们做出明显的更改,但一直显示在我的unstaged changes区域。如何从Git中的暂时更改中删除说明“旧模式100755新模式100644”的文件?

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

old mode 100755 
new mode 100644 

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

我该如何将这些文件从我的非暂存更改列表中取出? (非常讨厌必须通过100个文件,只是为了挑选出我最近编辑并希望提交的文件)。

回答

850

这看起来像UNIX文件权限模式,以我(755 = rwxr-xr-x644 = rw-r--r--) - 旧的模式包括+ X(可执行文件)的标志,新模式没有。

This msysgit issue's replies表明为了在设置core.filemode为false,以摆脱问题:

git config core.filemode false 
+95

+1。这意味着git认为它可以正确设置已签出文件上的可执行位,但是当它尝试这样做时,它不起作用(或者至少不能以其可读的方式)。然后,当它读回这些文件的状态时,它看起来像可执行位被故意取消设置。将core.filemode设置为false可以让git忽略文件系统上任何可执行的位更改,因此它不会将其视为更改。如果你确实需要执行一次可执行的位更改,这意味着你必须手动执行'git update-index --chmod =(+ | - )x '。 – 2009-08-11 06:49:42

+3

如果和我一样,模式更改很重要,可以将core.filemode设置为false,提交实际的代码更改,然后将core.filemode设置为true,git将保留文件更改。 – 2009-09-26 18:48:23

+8

我有同样的问题,但它是由于通过SSH git cmd行使用相同的git repro,并通过Git扩展在Windows映射的驱动器! 。 。解决方案是相同的,添加到“配置”[核心] filemode = false – 2010-03-18 09:07:48

6

你可以尝试 的git的复位 - 硬头 到回购恢复到预期的默认状态。

+4

如果git无法在拉出后正确/一致地设置可执行位,重置后它不会更好。 – 2009-08-11 06:34:15

+0

这种方式适用于副本翻转标志的复制存储库。 – AndrewCr 2010-11-08 22:05:48

+1

+1工作,我的错误是chmod 777到.git文件夹 – jimy 2011-06-29 06:12:05

73

将core.filemode设置为false确实有效。但是你要确保〜/ .gitconfig中的设置不会被.git/config中的设置覆盖。

+2

在那里,做到了。可悲的是,我只有在自己解决了问题后才发现您的评论。不过,+1! – 2011-02-16 15:23:18

+1

如果其他用户正在克隆这个项目是在Windows上,最好实际上只是将更改应用到'〜/ .gitconfig'文件! – 2011-12-13 09:16:14

4

看来你已经改变了目录的一些权限。我按照以下步骤来恢复它。

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

$ git checkout . 
0

我只是一个麻烦的文件与更改的权限。 为了单独回滚,我只是用rm <file>手动删除它,然后做了一个结帐来取出新副本。

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

如果我有我可以运行git checkout -- <file>

0

这发生在你拉,所有的文件都是可执行远程存储库之前已经运行git reset -- <file>。再次使它们可执行将使所有事情恢复正常。

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

你可能需要做的:

chmod -x <file> // Removes execute bit 

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

3

我用旧的硬盘复制一个git仓库时,遇到过这个问题。问题源于这一事实:所有者和权限已从旧驱动器/机器更改为新驱动器/机器。长期和短期的它,运行下面的命令来处理得很好(thanks to this superuser answer):

sudo chmod -R -x . # remove the executable bit from all files 

,前一项命令实际上会是git的差异报告的差异,但将取消您列出目录的能力,所以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 
+1

谢谢,帮了我很多!还应该检查'git config core.filemode'设置为'true',否则将不会检测到权限更改。我还需要在每次更改之后刷新git索引以提取它。 – 2018-01-19 14:56:09

+0

如果您担心受影响的依赖关系,此解决方案是最安全的。 – 2018-01-27 01:22:05