Git e desagradável "erro: não é possível bloquear informações / referências existentes fatais"

361

Após a clonagem do repositório remoto do git (em bettercodes), fiz algumas alterações, confirmei e tentei fazer o push:

git push origin master

Erros com:

erro: não é possível bloquear informações existentes / referências
fatal: falha no git-http-push

Este caso diz respeito ao repositório já existente.

O que eu fiz antes, foi:

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

Em 'bettercodes' não tenho acesso ao git log.

Estou usando o Windows. O erro detalhado foi:

C:\MyWorkStuff\Projects\Ruby\MyProject\>git push origin master
Unable to create branch path https://user:[email protected]/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed

Eu clonei antes, depois mudei o código e cometi.

AnnD
fonte
Sem sorte, o mesmo erro novamente.
214 AnnD
Duas razões possíveis: a) Outra instância do git está executando (matar todos os processos git ou reinicialização) b) .git pasta foi criada como linha de comando Administrador (administrador tentativa para a operação)
FractalSpace
Para mim, resolvi o erro ligando git fetchantes git pull.
Levi Fuller
11
Esse erro desagradável
RobW

Respostas:

686

Para mim, isso funcionou:

git remote prune origin

Como essa resposta parece ajudar muitas pessoas, eu me concentrei um pouco no que realmente acontece aqui. O que isto fará é remover referências a ramificações remotas na pasta .git/refs/remotes/origin. Portanto, isso não afetará suas ramificações locais e não mudará nada remoto, mas atualizará as referências locais que você tem para ramificações remotas. Parece que em alguns casos essas referências podem conter dados que o Git não pode manipular corretamente.

arno_v
fonte
11
Eu adicionei algumas informações de fundo, mas devo dizer honestamente que eu não sei exatamente por que e como funciona este :)
arno_v
11
origem remota git podar trabalho para mim. Mas eu apaguei toda a referência em .git / refs / remotes / origin.
Isuru Madusanka
2
É exatamente isso que gitsugere fazer, mas eu relutava em fazê-lo porque o comando parece fazer algo com o controle remoto.
Jogue fora a conta
4
Eu corrigit gc --prune=now
Stanley Mohlala
9
Este é o SCARIEST git cmd que eu já executei há algum tempo. (PS: funcionou)
Sáb Thiru 08/02
456

Você quer tentar:

git gc --prune=now

Consulte https://www.kernel.org/pub/software/scm/git/docs/git-gc.html

kiran.gilvaz
fonte
--Prune = agora é o mesmo que --prune = all? Nesse caso, a documentação avisa que você pode perder objetos não ancorados. Se houver objetos não ancorados, você provavelmente deve tentar reconciliá-los antes da remoção.
Assaf Israel
3
Economizador de vida, obrigado. git pullficou com a mensagem de erro semelhante.
Phil Brubaker
4
Isso ajudou na exceção "erro git: não é possível bloquear ref" na busca. Muito obrigado!
1777 Alexander
9
Isso funcionou para mim. Mas então eu tive que continuar executando o mesmo comando cada vez que uso um gitcomando que lida com controle remoto. git remote prune originresolveu o problema de uma vez por todas.
Keyur Golani
salvou o meu dia! Muito obrigado :)
Abhishek Gautam
188

Isso aconteceu comigo quando meu git remote (bitbucket.org) mudou seu endereço IP. A solução rápida foi remover e adicionar novamente o controle remoto, e tudo funcionou conforme o esperado. Se você não conhece como remover e adicionar novamente um controle remoto no git, aqui estão as etapas:

  1. Copie o URL SSH git do seu controle remoto existente. Você pode imprimi-lo no terminal usando este comando:

    git remote -v

que imprimirá algo como isto:

 origin [email protected]:account-name/repo-name.git (fetch)
 origin [email protected]:account-name/repo-name.git (push)
  1. Remova o controle remoto do seu repositório git local:

    git remote rm origin

  2. Adicione o controle remoto novamente ao seu repositório local:

    git remote add origin [email protected]:account-name/repo-name.git

johnnyclem
fonte
8
Eu tentei de tudo, como git gc, git prune, rm 'file with lock error', git update server info, etc. Somente essa resposta funcionou para mim. Às vezes, é como uma reinicialização do Windows, reinicialização e funcionará. Mesmo aqui, basta remover e adicionar o repo de novo, e tudo vai bem;)
Marquinho Peli
12
Após o procedimento acima, eu também precisava dizer git para rastrear a filial remota novamente com por exemplo:git branch -u origin/master
fotinsky
Isso explodiu todas as minhas informações de rastreamento remoto no .git / config e não funcionou.
ThomasMcLeod 11/06/19
Isso funcionou para mim também. Todos os outros não funcionaram.
dondrzzy
42

Comando em execução git update-ref -d refs/heads/origin/branchcorrigido.

akansh tayal
fonte
4
Esse comando também fez o truque para mim, embora minha referência de filial remota fosse um pouco diferente:git update-ref -d refs/remotes/origin/my_branch
ndeslandes
Isso funcionou para mim, parece que esse foi um problema de sensibilidade ao caso. Havia dois ramos com o mesmo nome que foram empurrados para a origem por outro usuário do git, um com letras minúsculas e outro com letras maiúsculas.
precisa saber é o seguinte
24

Corrigi isso fazendo o seguinte

git branch --unset-upstream
rm .git/refs/remotes/origin/{branch}
git gc --prune=now
git branch --set-upstream-to=origin/{branch} {branch}
#or git push --set-upstream origin {branch}
git pull

Isso assumindo que suas ramificações locais e remotas estão alinhadas e você está recebendo o erro refs como não fatal.

FrankMonza
fonte
12

Eu tive esse problema porque estava em uma ramificação que tinha um nome semelhante a uma ramificação upstream. ou seja, o ramo upstream foi chamado example-branche meu ramo local foi chamado example-branch/backend. A solução foi alterar o nome da minha filial local da seguinte forma:

git branch -m <new name goes here>
George Armstrong
fonte
12

O que funcionou para mim foi:

  1. Retirar .git/logs/refs/remotes/origin/branch
  2. Retirar .git/refs/remotes/origin/branch
  3. Corre git gc --prune=now
emirc
fonte
11
Funcionou como um encanto. Se alguém estiver enfrentando problemas com a ramificação do nome do arquivo / pasta, na verdade, está se referindo a todos os arquivos / pastas do nome da ramificação. Eu espero que isso ajude!
Ankit Kesharwani
11

Provavelmente isso já está resolvido. Mas aqui está o que funcionou para mim.

  1. Localização:

    • Se o repositório bloqueado estiver no lado do servidor:

      1. ssh no seu repositório git no servidor.
      2. Efetue login como usuário com permissões para modificar o repositório e navegue até o repositório em seu servidor.
    • Se o repositório bloqueado for apenas local:

      1. Abra o console git e navegue para o diretório do repositório.
      2. Execute este comando:

        git update-server-info
        
  2. Corrija as permissões no seu repositório (remoto ou / e local), se necessário. No meu caso, eu tive chmodque 777e chownparaapache:apache

  3. Tente enviar novamente a partir do repositório local:

    git push
    
WolfTail
fonte
7

É assim que funciona para mim.

  1. procure o arquivo de bloqueio do Apache DAV no seu servidor (por exemplo, / var / lock / apache2 / DAVlock)
  2. delete isso
  3. recriá-lo com permissões de gravação para o servidor da web
  4. reinicie o servidor da web

Alternativa ainda mais rápida:

  1. procure o arquivo de bloqueio do Apache DAV no seu servidor (por exemplo, / var / lock / apache2 / DAVlock)
  2. Esvazie o arquivo: cat /dev/null > /var/lock/apache2/DAVlock
  3. reinicie o servidor da web
schmunk
fonte
Este foi o meu problema. Obrigado pelo post. Executei a remoção e as permissões de uma só vez. #> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely
6

Isso parece um problema de permissão - é possível que você tenha duas janelas abertas, executando com direitos separados? Talvez verifique a propriedade da pasta .git.

Talvez verifique se há um bloqueio de arquivo pendente aberto, talvez use lsof para verificar ou o equivalente para o seu sistema operacional.

Josh
fonte
3

No meu caso, uma ramificação foi movida para um subdiretório e o diretório foi chamado como ramificação. Git ficou confuso com isso. Quando excluí a ramificação local (no SourceTree, apenas com o botão direito do mouse em excluir), tudo funcionava normalmente.

CodingYourLife
fonte
3

No meu caso, depois de receber esta mensagem, executei o comando checkout e recebi esta mensagem:

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

Depois de executar este comando, voltei ao normal.

Colin
fonte
2

Atualizar:

Pode ser necessário editar seu arquivo ~ / .netrc:

https://bugs.launchpad.net/ubuntu/+source/git-core/+bug/293553

Resposta original:

Por que você desativou o ssl? Acho que isso pode ter a ver com você não conseguir enviar via https. Eu colocaria de volta e tentaria empurrar novamente:

git config –global http.sslVerify true
ralphtheninja
fonte
1

Verifique se você (processo git realmente) tem acesso ao arquivo .git/info/refse se esse arquivo não está bloqueado por outro processo.

Ivan Danilov
fonte
2
Como você verifica isso?
Iulian Onofrei 21/03/19
1

Eu tive esse problema quando estava tentando criar uma nova ramificação de recurso que continha o nome da ramificação antiga, por exemplo, origem - branch1 e eu queria criar o branch1-feature. Não era possível, mas o branch1 / feature já estava.

user11464384
fonte
1

No meu caso, tive que excluir manualmente as tags antigas que foram removidas no controle remoto.

joliejuly
fonte
1

No meu caso, ele estava conectado ao nome do ramo que eu já havia criado.

Para corrigir o problema, criei um ramo com o nome que por certo não deveria existir, como:

git checkout -b some_unknown_branch

Depois, limpei todos os meus outros ramos (não ativos) porque eram apenas lixo desnecessário.

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

e renomeei minha ramificação atual com o nome que pretendi, como:

git checkout -m my_desired_branch_name
Arsen Khachaturyan
fonte
0

No caso do bettercodes.org, a solução é mais poética - o único problema pode estar nos direitos atribuídos aos membros do projeto. Membros simples não têm direitos de gravação! Verifique se você possui os direitos de moderador ou administrador. Isso precisa ser definido em bettercodes.org nas configurações do projeto por um administrador, é claro.

yman
fonte
0

Vi esse erro ao tentar git filter-branchdesanexar muitos subdiretórios em um novo repositório separado (como nesta resposta ).

Eu tentei todas as soluções acima e nenhuma delas funcionou. Por fim, decidi que não precisava preservar minhas tags tão mal no novo ramo e apenas executei:

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
tessafyi
fonte