![Git chmod 问题:Checkout 螺丝执行位](https://linux22.com/image/1255031/Git%20chmod%20%E9%97%AE%E9%A2%98%EF%BC%9ACheckout%20%E8%9E%BA%E4%B8%9D%E6%89%A7%E8%A1%8C%E4%BD%8D.png)
在 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:顺便说一句,我提交的这个存储库中的每个文件都会发生这种情况。成功提交后,如果没有权限问题,我就无法切换分支。
答案1
我不是 Git 用户,但我相信 Git 存储了整个文件权限掩码。
这意味着您曾经将文件设置为可执行文件,Git 会将其获取并复制到存储库中。因此,您必须在提交之前更改文件的权限掩码本身。
要使 Git 忽略此类更改,请使用
git config core.filemode false
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.
答案2
您是否检查过在提交或签出期间是否有执行的自定义钩子?可能有一些自定义钩子篡改了您的文件。签出githooks 手册页。
钩子基本上是 git 在某些事件(提交、签出等)时调用的小程序。
答案3
您是否尝试过在分支 dev-branch 上执行 git commit -m 'mode is 644' 文件
在我看来,发生的事情是您正在更改主权限,然后下拉具有错误权限的 dev 分支,破坏了您的本地权限。然后尝试再次提交。要么克隆,更改,提交,合并;或者尝试使用单个文件提交到 dev 然后合并来单独更改文件
答案4
这些链接里有很好的答案。
https://stackoverflow.com/questions/9027584/how-to-change-the-file-mode-on-github
和
本质上您需要这样做git update-index --chmod=(+|-)x <file>
,这将添加一个更改,然后您需要提交并推动以添加/删除权限。