Git Push 無法寫入目標檔案 - 權限被拒絕

Git Push 無法寫入目標檔案 - 權限被拒絕

我正在克隆存儲庫並嘗試推送到我的遠端分支。承諾工作得很好,但是每當我嘗試推動時,我都會得到這樣的訊息:

error: unable to write file ./objects/foo/bar: Permission denied

我擁有本地存儲庫中的所有文件,通常推送工作得很好,但是一段時間後會出現此錯誤並且我無法推送。

解決該問題的唯一方法是恢復到原點上的最後一次提交,並嘗試尋找應該引起問題的檔案。

然後,我觸摸一個新文件並貼上舊“損壞”文件中的內容。有時這也沒有幫助,顯然這不是一個容易管理的解決方法。

答案1

我遇到了這個問題並發現了這個問題。我閱讀了發佈在的提示https://www.thegeekstuff.com/2017/05/git-push-error/並總結什麼解決了問題(對我來說)。

解決方法是設定持有 GIT REPO 的主機,使其包含一個共用群組,所有 git 使用者都會新增到該共用群組。例如,/etc/group

git:x:4001:user1,user2

接下來,在持有 git 儲存庫的主機上,執行以下命令:

cd /local/git-repos/repo1.git
sudo chgrp -R git objects
sudo chmod -R g+rws objects

對我來說這解決了問題。引用的文章解釋了有關將存儲庫配置為共享存儲庫的更多信息,但我還沒有這樣做。

git config core.sharedRepository group

為什麼會發生這種情況?如果您有興趣,請繼續閱讀。

為什麼會出現這種情況

對我來說,當我設定一個我(user1)與一些同事共享的私人 git 儲存庫時,就會發生這種情況。該儲存庫位於我的主機(例如 host1)上,並且 user2@host2 也在使用它。

以下是我用於設定此問題的步驟,並在適當的位置解釋了問題發生的位置。

  1. 我是 user1@host1,我使用以下命令建立了一個裸 git 儲存庫:

    mkdir /local/git-repos
    cd /local/git-repos
    git init --bare repo1.git
    
  2. 我設定了一個 ~/.ssh/config 文件,以便 git 儲存庫使用的名稱是邏輯名稱。這樣做是為了,如果我將盒子移動到另一台計算機,我所要做的就是將主機別名更新為新的計算機名稱。

    文件:$HOME/.ssh/config

    Host mygithost
        HostName host1
    
  3. 然後我使用克隆存儲庫

    cd $HOME
    git clone mygithost:/local/git-repos/repo1.git
    cd repo1
    # Add files and use normal git commands
    git add -u .
    git commit
    git push
    

    更新將發送到電腦上的 git 儲存庫

  4. 設定 user2,以便他們可以存取同一個 GIT 儲存庫

    • 您需要像為 user1 所做的那樣設定 $HOME/.ssh/config 檔案。
    • 確保使用者以自己的身分透過 ssh 登入 host1。
    ssh user2@mygithost echo it worked
    cd $HOME
    git clone mygithost:/local/git-repos/repo1.git
    

    此時,使用者 user1 和 user2 都可以存取共用的 GIT 儲存庫。

    如果兩個都使用者進行提交,然後 git REPO 物件檔案將包含一些由 擁有的文件user1和一些由user2.問題是,稍後當user1嘗試將檔案推送到 GIT HOST時object,建立的檔案和目錄可能歸其所有,user2因此會出現以下錯誤。

    error: insufficient permission for adding an object to repository database ./objects
    fatal: failed to write object
    error: unpack failed: unpack-objects abnormal exit
     ! [remote rejected] master -> master (n/a (unpacker error))
    error: failed to push some refs to [email protected]:/home/git/myproj
    
    

    解決方案是配置 git bare 儲存庫,以便任何使用者都可以讀取/寫入任何其他使用者建立的檔案。 這是透過下一步使用UNIX GROUP權限來完成的。

  5. 設定 REPO,以便不同使用者可以存取 git 儲存庫。

    • 建立一個所有使用者都可以加入的群組

      sudo vi /etc/group
      git:x:4001:user1,user2
      
    • 更改所有文件,以便它們正確地位於新建立的群組中。

      cd /local/git-repos/repo1.git
      sudo chgrp -R git objects
      sudo chmod -R g+rws objects
      

    使用您在上面建立的任何共享群組(git在本範例中)。

注意:group-suid 位元很重要,因為它會導致將來建立的檔案/目錄保留與父目錄相同的設定。從https://www.redhat.com/sysadmin/suid-sgid-sticky-bit, 它說:

如果在目錄上設置,則在該目錄中建立的任何檔案都將其群組所有權設定為目錄所有者的群組所有權

概括

此錯誤通常不應發生在任何正常託管的 GIT REPO 上。但在所描述的由多個使用者設定和共享私有(基於檔案的)儲存庫的情況下,可能會發生這種情況。

相關內容