Git chmod问题:checkout螺丝exec位


9

在Ubuntu和Debian下,最后提交的文件正在设置执行位,之后我尝试结账。这很奇怪,让我疯了:

$ ls -l file
-rw-r--r-- ... file

# on branch master:
$ git commit -m 'mode is 644' file
[master 0123456] mode is 644
 1 files changed, 1 insertions(+), 1 deletions(-)
# All ok

$ git checkout dev-branch
Switched to branch 'dev-branch'
# Seemingly all ok, but file now has the exec bit set

$ git merge master
Updating 6543210..0123456
error: Your local changes to 'file' would be overwritten by merge.  Aborting.
Please, commit your changes or stash them before you can merge.
# Oops...

$ ls -l file
-rwxr-xr-x ... file

有没有人知道,执行位何时以及为什么会滑入? core.filemode 被设置为 true

我在分支切换期间在vim中打开文件,如果这在某种程度上是重要的。

附录1: 这是结帐,权限被搞砸了。我可以继续玩游戏:

$ git br
* master
  dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout master

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

# ...and so on ad inf.

附录2: 顺便说一下,对于我提交的存储库中的每个文件,都会发生这种情况。成功提交后,我无法在没有权限搞砸的情况下切换分支。


你在#seemingly all ok步骤检查了权限吗?
RobotHumans

我同意这里。在dev-branch上,'git-log master ... HEAD - file',看看分支和现在该文件之间是否有任何变化。
yuriismaster

@ aking1012:是的,此时文件模式已经改变。我会更新这个问题。
Boldewyn

@yuriismaster: git-log 根本没有显示任何输出 masterdev-branch 要么 HEAD (这很奇怪,不是吗?命令不应该打印最后一次提交消息 master?)
Boldewyn

2
你在用什么文件系统?
bitmask

Answers:


11

不是Git用户,但我相信Git存储整个文件权限掩码。

这意味着您曾经将文件设置为可执行文件,Git会在存储库中选择并复制该文件。因此,您必须在提交之前更改文件的权限掩码。

要让Git忽略这些更改,请使用

git config core.filemode false

GIT-配置(1)

   core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.

1
实际上,我努力提交具有正确权限的文件。我甚至在chmod之后重新提交了所有文件。由于我不时在Windows上工作(不是用这个回购),我知道 core.fileMode,但我希望能够离开它 true
Boldewyn

在处理他们称之为“破碎文件系统”的东西时,它甚至可能是git中的一个错误。没有损坏的文件系统,只有破碎的软件。
harrymc

4
我必须同意git开发人员认为脂肪已经坏了
RobotHumans

3
好的,这是文件系统。我无法在通过NFS挂载目录的另一台机器上重现它。在主机上,就像我说的那样,是CIFS。当我在git邮件列表上询问时,我得到了答案,CIFS在执行位上被打破了。该死!
Boldewyn


3

您是否检查在提交或结帐期间是否存在自定义挂钩?可能有一些自定义挂钩篡改您的文件。结帐 githooks manpage

钩子基本上是由git在某些事件(提交,结账等)调用的小程序。


好的尝试,但我的 .git/hooks 目录未受影响。
Boldewyn

1

你有没有尝试过git commit -m'模式是分支dev-branch上的644'文件

对我来说,看起来正在发生的事情是你正在更改main上的权限然后拉下具有错误权限的dev分支,破坏你的本地权限。然后再次尝试提交。克隆,更改,提交,合并;或尝试单独更改文件,单个文件提交到dev然后合并


实际上,我从未在原始场景中触及权限。所有权限更改都通过git在“结帐”步骤中完成。
Boldewyn

......就是说,我做了一些 chmod 一旦打开文件,但我不能不记得,如果问题在之后开始发生。我想,它没有。
Boldewyn

我试图复制你的问题,我不能
RobotHumans

那是因为你没有在已安装的CIFS上工作;-)。我忘记了+1的尝试,谢谢!
Boldewyn

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.