Broken pipe errors on
- Timeout during
git cloneover HTTP fails with
transfer closed with outstanding read data remainingerror
Sometimes things don’t work the way they should or as you might expect when you’re using Git. Here are some tips on troubleshooting and resolving issues with Git.
‘Broken pipe’ errors can occur when attempting to push to a remote repository. When pushing you will usually see:
Write failed: Broken pipe fatal: The remote end hung up unexpectedly
To fix this issue, here are some possible solutions.
If you’re using Git over HTTP instead of SSH, you can try increasing the POST buffer size in Git’s configuration.
Example of an error during a clone:
fatal: pack has bad object at offset XXXXXXXXX: inflate returned -5
Open a terminal and enter:
git config http.postBuffer 52428800
The value is specified in bytes, so in the above case the buffer size has been set to 50MB. The default is 1MB.
If pushing over SSH, first check your SSH configuration as ‘Broken pipe’ errors can sometimes be caused by underlying issues with SSH (such as authentication). Make sure that SSH is correctly configured by following the instructions in the SSH troubleshooting docs.
There’s another option where you can prevent session timeouts by configuring SSH ‘keep alive’ either on the client or on the server (if you are a GitLab admin and have access to the server).
To configure SSH on the client side:
On UNIX, edit
~/.ssh/config(create the file if it doesn’t exist) and add or edit:
Host your-gitlab-instance-url.com ServerAliveInterval 60 ServerAliveCountMax 5
On Windows, if you are using PuTTY, go to your session properties, then navigate to “Connection” and under “Sending of null packets to keep session active”, set “Seconds between keepalives (0 to turn off)” to
To configure SSH on the server side, edit
/etc/ssh/sshd_config and add:
ClientAliveInterval 60 ClientAliveCountMax 5
If ‘pack-objects’ type errors are also being displayed, you can try to
git repack before attempting to push to the remote repository again:
git repack git push
In case you’re running an older version of Git (< 2.9), consider upgrading to >= 2.9 (see Broken pipe when pushing to Git repository).
Users may experience the following error when attempting to push or pull using Git over SSH:
Please make sure you have the correct access rights and the repository exists. ... ssh_exchange_identification: read: Connection reset by peer fatal: Could not read from remote repository.
ssh_exchange_identification: Connection closed by remote host fatal: The remote end hung up unexpectedly
This error usually indicates that SSH daemon’s
MaxStartups value is throttling
SSH connections. This setting specifies the maximum number of concurrent, unauthenticated
connections to the SSH daemon. This affects users with proper authentication
credentials (SSH keys) because every connection is ‘unauthenticated’ in the
beginning. The default value is
MaxStartups on the GitLab server
by adding or modifying the value in
100:30:200 means up to 100 SSH sessions are allowed without restriction,
after which 30% of connections will be dropped until reaching an absolute maximum of 200.
Once configured, restart the SSH daemon for the change to take effect.
# Debian/Ubuntu sudo systemctl restart ssh # CentOS/RHEL sudo service sshd restart
If pulling/pushing from/to your repository ends up taking more than 50 seconds, a timeout will be issued with a log of the number of operations performed and their respective timings, like the example below:
remote: Running checks for branch: master remote: Scanning for LFS objects... (153ms) remote: Calculating new repository size... (cancelled after 729ms)
This could be used to further investigate what operation is performing poorly and provide GitLab with more information on how to improve the service.
If the buffer size is lower than what is allowed in the request, the action will fail with an error similar to the one below:
error: RPC failed; curl 18 transfer closed with outstanding read data remaining fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed
This can be fixed by increasing the existing
http.postBuffer value to one greater than the repository size. For example, if
git clone fails when cloning a 500M repository, the solution will be to set
524288000 so that the request only starts buffering after the first 524288000 bytes.
http.postBuffer, 1 MiB, is applied if the setting is not configured.
git config http.postBuffer 524288000