Git chmod 問題:簽出螺絲執行位

Git chmod 問題:簽出螺絲執行位

在 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

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.

答案2

您是否檢查了在提交或簽出期間是否執行了自訂掛鉤?可能有一些自訂掛鉤會篡改您的檔案。結帳githooks 線上說明頁

鉤子基本上是 git 在某些事件(提交、簽出等)中呼叫的小程式。

答案3

您是否嘗試過 git commit -m 'mode is 644' 在分支 dev-branch 上的文件

對我來說,發生的事情似乎是您正在更改 main 上的權限,然後拉下具有錯誤權限的開發分支,從而破壞您的本地權限。然後嘗試再次提交。克隆、更改、提交、合併;或嘗試透過將單一文件提交到 dev 中來單獨更改文件,然後合併

答案4

這些連結中有很好的答案。

https://stackoverflow.com/questions/9027584/how-to-change-the-file-mode-on-github

https://stackoverflow.com/questions/1611211/how-do-i-make-git-accept-mode-changes-without-accepting-all-text-changes

本質上,您需要這樣做git update-index --chmod=(+|-)x <file>,這將添加一個更改,然後您需要提交並推送該更改以添加/刪除權限。

相關內容