在 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
您是否嘗試過 git commit -m 'mode is 644' 在分支 dev-branch 上的文件
對我來說,發生的事情似乎是您正在更改 main 上的權限,然後拉下具有錯誤權限的開發分支,從而破壞您的本地權限。然後嘗試再次提交。克隆、更改、提交、合併;或嘗試透過將單一文件提交到 dev 中來單獨更改文件,然後合併
答案4
這些連結中有很好的答案。
https://stackoverflow.com/questions/9027584/how-to-change-the-file-mode-on-github
和
本質上,您需要這樣做git update-index --chmod=(+|-)x <file>
,這將添加一個更改,然後您需要提交並推送該更改以添加/刪除權限。