Git and nasty "error: cannot lock existing info/refs fatal"

Viewed 571390

After cloning from remote git repository (at bettercodes) I made some changes, commited and tried to push:

git push origin master

Errors with:

error: cannot lock existing info/refs
fatal: git-http-push failed

This case regards already existing repository.

What I did before, was:

  1. git config –global http.sslVerify false
  2. git init
  3. git remote add [url]
  4. git clone
  5. change data
  6. git commit

At 'bettercodes' I have no access to git log.

I'm using Windows. The detailed error was:

C:\MyWorkStuff\Projects\Ruby\MyProject\>git push origin master
Unable to create branch path https://user:password@git.bettercodes.org/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed

I cloned before, then changed the code and committed.

33 Answers

Running command git update-ref -d refs/heads/origin/branch fixed it.

What worked for me was:

  1. Remove .git/logs/refs/remotes/origin/branch
  2. Remove .git/refs/remotes/origin/branch
  3. Run git gc --prune=now

More about git gc command here: https://git-scm.com/docs/git-gc

Before pull you need to clean your local changes. following command help me to solve.

git remote prune origin

and then after

git pull origin develop

Hopes this helps!

As a reference for Visual Studio Code (vscode, code) (and possibly other IDEs)

I had to do command: Git: Fetch (Prune)

Command line alternative should be: git fetch --prune

Then restart the whole IDE.

And to give some perspective I will quote BitBucket's docks:

What’s the Difference Between Git Prune,
Git Fetch --prune, and Git Remote Prune?

git remote prune and git fetch --prune do the same thing: delete the refs to branches that don't exist on the remote. This is highly desirable when working in a team workflow in which remote branches are deleted after merge to main. The second command, git fetch --prune will connect to the remote and fetch the latest remote state before pruning. It is essentially a combination of commands:
git fetch --all && git remote prune
The generic git prune command is entirely different. As discussed in the overview section, git prune will delete locally detached commits.

In my case after getting this message I did the checkout command and was given this message:

Your branch is based on 'origin/myBranch', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

After running this command I was back to normal.

Run git fetch --all before git pull. That should solve the problem.

I had a typical Mac related issue that I could not resolve with the other suggested answers.

Mac's default file system setting is that it is case insensitive.

In my case, a colleague obviously forgot to create a uppercase letter for a branch i.e.

testBranch/ID-1 vs. testbranch/ID-2

for the Mac file system (yeah, it can be configured differently) these two branches are the same and in this case, you only get one of the two folders. And for the remaining folder you get an error.

In my case, removing the sub-folder in question in .git/logs/ref/remotes/origin resolved the problem, as the branch in question has already been merged back.

I had this problem, when I was trying to create a new feature branch that contained name of the old branch, e.g. origin - branch1 and I wanted to create branch1-feature. It wasn't possibble, but branch1/feature was already.

Aside from the many answers already supplied to this question, a simple check on the local repo branches that exist in your machine and those that don't in the remote, will help. In which case you don't use the

git prune

command as many have suggested.

Simply delete the local branch

git branch -d <branch name without a remote tracking branch by the same name>

as shown in the attached screenshot using -D to force delete when you are sure that a local branch does not have a remote branch tracked.

lock ref error git

Case 1: Let check branches from git-server if they are duplicated or not.

Example: two branches below are duplicated:

    - upper_with_lower
    - UPPER_with_lower

---> Let consider removing one of them.

Case 2: The branch you are pushing are duplicated with other branch.

In my case, it was connected with the branch name that I had already created.

To fix the issue I've created a branch with the name that for certain shouldn't exist, like:

git checkout -b some_unknown_branch

Then I've cleared all my other branches(not active) because they were just unnecessary garbage.

git branch | grep -v \* | grep -v master | xargs git branch -D

and then renamed my current branch with the name that I've intended, like:

git checkout -m my_desired_branch_name

In my case I had to manually delete old tags which had been removed on remote.

If you are in the fortunate position of having no local work to commit/push and time to get coffee, you could simply delete your local copy of the repo and re-clone

I got this issue when I tried to create a branch that starts with a current branch. I had a branch named develop and I tried to create a branch called develop/myFeature.

I had a similar issue that totally confused me. I had a local branch named test and was trying to fetch and checkout remote branch named test/some-changes.

Fix was just to remove a stale test branch, and I could fetch and checkout the remote one.

I saw this error when trying to run git filter-branch to detach many subdirectories into a new, separate repository (as in this answer).

I tried all of the above solutions and none of them worked. Eventually, I decided I didn't need to preserve my tags all that badly in the new branch and just ran:

git remote remove origin
git tag | xargs git tag -d
git gc --prune=now
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- apps/AAA/ libs/xxx' --prune-empty -- --all

For me it was happening when I try to create a new branch with a name like this one:

master/pre-upgrade

changing it to another name like:

pre-upgrade/master

did the trick!

This error was coming on doing

git fetch

but in my case I just wanted the update of the main branch which can be done using

git fetch origin main

Not a solution to lock ref problem but it helped me avoid the problem :P

for me, removing .git/info/ref kick things going.There shouldn't be a ref file when git is not running. But in my case there were one for whatever reason and caused the problem.

Removing the file will not remove any of your local commits or branches.

Related