git: can't push (unpacker error) related to permission issues

LinuxGit

Linux Problem Overview


I have this problem when i try to push in git:

error: insufficient permission for adding an object to repository database ./objects

fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To ssh://<repo url>/<repo dir>
 ! [remote rejected] master -> master (n/a (unpacker error))
error: failed to push some refs to 'ssh://<repo url>/<repo dir>'

I've had this before sporadically and we've always had to solve it by each user sshing to the repo and setting group permissions on all the files therein with

chmod -R g+w *

This was never a satisfactory solution and now it's bitten us in the arse as one of the guys is away and no-one knows his repo user's password. So, i'm trying to solve it properly.

The error seems to occur when someone tries to push up a change that will alter a repo dir that is owned by another user (hence setting the group write option above). I've done a bit of googling around this and have found a couple of solutions being discussed (neither of which worked for me)

  1. make sure that the group that the repo dirs are shared with is each users' primary group (i believe that is the case already: each user has only one group so that must be their primary group, right?)

  2. git repo core.sharedRepository setting, as detailed here: https://stackoverflow.com/questions/398203/git-cant-push-from-one-computer#answer-399133 I changed this but it didn't make any difference. Do i need to reload the config or something to actually effect the change?

Here's what my repo config looks like atm:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
        sharedRepository = all
[receive]
        denyNonFastForwards = True

Grateful for any advice or suggestions! max

Linux Solutions


Solution 1 - Linux

I had this error for two weeks, and the majority of the solutions stated 'chmod -R' as the the answer, unfortunately for me my git repos (local / remote / shared - with team) were all on Windows OS, and even though chmod -Rv showed all the files changed to 'rwxrwxrwx', a subsequent 'ls -l' still showed all files as 'rwxr-xr-x' and the error repeated itself. I eventually saw this solution by Ariejan de Vroom. It worked and we were all able to pull and push again.

On both local (the local that is having trouble pushing) and remote repos, run the following commands:

$ git fsck
$ git prune
$ git repack
$ git fsck

On a side note, I tried using Windows' native file permissions / ACL and even resorted to elevating the problem user to Administrator, but none of that seemed to help. Not sure if the environment is important, but it may help someone with a similar setup - problem team member and remote (Windows Server 2008 R2 Standard), my local (Windows 7 VM).

Solution 2 - Linux

A simpler way to do this is to add a post-receive script which runs the chmod command after every push to the 'hub' repo on the server. Add the following line to hooks/post-receive inside your git folder on the server:

chmod -Rf u+w /path/to/git/repo/objects

Solution 3 - Linux

It is a permission error. The way that was most appropriate and secure for me was adding users to a supplementary group that the repo. is owned by (or vice versa):

groupadd git
chgrp -R git .git
chgrp -R git ./
usermod -G -a git $(whoami)

Solution 4 - Linux

> In case anyone else is stuck with this: it just means the write > permissions are wrong in the repo that you’re pushing to. Go and chmod > -R it so that the user you’re accessing the git server with has write access.

Solution 5 - Linux

For me, this error occurred when I was out of space on my remote.

I just needed to read the rest of the error message:

error: file write error (No space left on device)
fatal: unable to write sha1 file
error: unpack failed: unpack-objects abnormal exit

Solution 6 - Linux

For the permission error using git repository on AWS instance, I successfully solved it by creating a group, and assigning it to the repository folder recursively(-R), and give the written right to this group, and then assign the default aws instance user(ec2-user or ubuntu) to this group.

###1. Create a goup name share_group or something else

     sudo groupadd share_group

###2. change the repository folder from 'root' group to 'share_group'

     sudo chgrp -R share_group /path/to/your/repository

###3. add the write authority to share_group

     sudo chmod -R g+w /path/to/your/repository

###4. The last step is to assign current user--default user when login (by default ec2 is 'ec2-user', user of ubuntu instance is 'ubuntu' in ubuntu on aws) to share_group. I am using ubuntu insance on aws, so my default user is ubuntu.

     sudo usermod -a -G share_group ubuntu

By the way, to see the ownership of the folder or file just type:

    ls -l  /path/to/your/repository

' ###Output:

    drwxr-x--x  2 root shared_group

#####(explanation please see:https://wiki.archlinux.org/index.php/File_permissions_and_attributes).

After step 3, you will see

    drwx--x--x  2 root root

###changed to

    drwxr-x--x  2 root share_group 

###In this case, I did not assign user 'ubuntu' to root group, for the consideration of security. You can just try to assign you default user to root according to step 4 (just skip the first 3 steps


###In another way, tried the solution by :

    chmod -Rf u+w /path/to/git/repo/objects

####It did not work for me, I think it should be the reason that my repository folder belong to the root user, not to Ubuntu user, and 'git' by default use the default user(ec2-user or Ubuntu user. You can try to change the user and test it.


Finally, below code definitely work for me, but 777 is not good for security
    sudo chmod -R 777 /path/to/your/repo

Solution 7 - Linux

I use gitosis for managing this kind of stuff. Gitosis has a single user (usually called "git") that owns all the repositories, and it uses public-key-based access control to each repo. It might not suit your setup but is probably worth checking out (no pun intended).

Solution 8 - Linux

This problem can also occur after Ubuntu upgrades that require a reboot.

If the file /var/run/reboot-required exists, do or schedule a restart.

Solution 9 - Linux

I was having trouble with this too, thinking my remote gitolite-admin was corrupted or something wrong.

My setup is Mac OS X (10.6.6) laptop with remote Ubuntu 10 server with gitolite.

It turned out that the problem was with my local checkout of gitolite-admin.

Despite the "unpack failed" error, it turned out the the problem was local.

I figured this out by checking it out again as gitolite-admin2, making a change, and the pushing.

Voila! It worked!

Solution 10 - Linux

I was getting similar error and please see below how I resolved it.

My directory structure: /opt/git/project.git and git user is git

$ cd /opt/git/project.git
$ sudo chown -R git:git .

chown with -R option recursively changes the ownership and and group (since i typed git:git in above command) of the current directory. chown -R is necessary since git changes many files inside your git directory when you push to the repository.

Solution 11 - Linux

For what it worth, I had the same problem over my own VPS and it was caused by my low hard disk space on VPS. Confirmed by df -h command and after i cleaned up my VPS' hard disk; the problem was gone.

Cheers.

Solution 12 - Linux

Where I work we have been using this method on all of our repositories for a few years without any problems (except when we create a new repository and forget to set it up this way):

  1. Set 'sharedRepository = true' in the config file's '[core]' section.

  2. Change the group id of the repository to a group shared by all users who are allowed to push to it:

     chgrp -R shared_group /git/our_repos
     chmod -R g+w /git/our_repos
    
  3. Set the setgid bit on all directories in the repository so that new files/directories keep the same group:

     find /git/our_repos -type d -exec chmod g+s {} +
    
  4. Add this line to the pre-receive hook in the repository to ensure new file permissions allow group read/write:

     umask 007
    

Solution 13 - Linux

For me its a permissions issue:

On the git server run this command on the repo directory

sudo chmod -R 777 theDirectory/

Solution 14 - Linux

A git configuration mistake can also product this error. I give my students and example of configuration like this:

git config --global user.name "John Doe"
git config --global user.email [email protected]

One of my students was getting the unpacker error. Other students were fine, but I still did a double check on the git server's permissions and to be sure the student was in proper group.

Finally, I had the student do a git log and saw that he had John Doe for his configuration, but his branch was his own name.

Setting up his configuration properly eliminated the error .

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMax WilliamsView Question on Stackoverflow
Solution 1 - LinuxJason RobinsonView Answer on Stackoverflow
Solution 2 - LinuxspadeworkersView Answer on Stackoverflow
Solution 3 - LinuxAlastairView Answer on Stackoverflow
Solution 4 - LinuxsjasView Answer on Stackoverflow
Solution 5 - LinuxaradilView Answer on Stackoverflow
Solution 6 - LinuxHenning LeeView Answer on Stackoverflow
Solution 7 - LinuxCameron SkinnerView Answer on Stackoverflow
Solution 8 - LinuxcmcView Answer on Stackoverflow
Solution 9 - LinuxjpswainView Answer on Stackoverflow
Solution 10 - LinuxHrushikeshView Answer on Stackoverflow
Solution 11 - LinuxdariushView Answer on Stackoverflow
Solution 12 - LinuxMark E. HamiltonView Answer on Stackoverflow
Solution 13 - LinuxMobileMonView Answer on Stackoverflow
Solution 14 - LinuxAnthony PetrilloView Answer on Stackoverflow