Gitと厄介な「エラー:既存の情報をロックできません/致命的なエラー」


361

リモートのgitリポジトリから(bettercodesで)クローンを作成した後、いくつかの変更を加え、コミットしてプッシュしようとしました。

git push origin master

エラー:

エラー:既存の情報/参照をロックできません
fatal:git-http-pushが失敗しました

このケースは、既存のリポジトリに関係します。

私が以前にしたことは、

  1. git config –global http.sslVerify false
  2. git init
  3. git remote add [url]
  4. git clone
  5. データを変更する
  6. git commit

'bettercodes'では、git logにアクセスできません。

Windowsを使用しています。詳細なエラーは次のとおりです。

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

以前にクローンを作成し、コードを変更してコミットしました。


運が悪い、もう一度同じエラー。
AnnD 2011

2つの考えられる理由:a)gitの別のインスタンスが実行されている(すべてのgitプロセスを
強制終了

私にとっては、git fetchbefore を呼び出すことでエラーを解決しましたgit pull
Levi Fuller

1
そのエラーは厄介です
RobW

回答:


685

私にとってこれはうまくいきました:

git remote prune origin

この答えは多くの人を助けるように思われるので、私は実際にここで何が起こっているのかを少し掘り下げました。これにより、フォルダー内のリモートブランチへの参照が削除されます.git/refs/remotes/origin。したがって、これはローカルブランチに影響を与えず、リモートで何も変更しませんが、リモートブランチへのローカル参照を更新します。これらの参照には、Gitが正しく処理できないデータが含まれている場合があります。


1
いくつかの背景情報を追加しましたが、正直に言って、なぜ、どのように機能するのか正確にはわからないのです:)
arno_v

1
git remote prune originは私のために働いています。しかし、私は.git / refs / remotes / origin内のすべての参照を削除しました。
Isuru Madusanka

2
これはまさに実行することをgit示唆していることですが、コマンドがリモートに対して何かをしているように聞こえるので、私はそれをするのをためらっていました。
アカウント

4
私が走ったgit gc --prune=now
スタンリー・モララ

9
これは、しばらく実行した中で最もSCARIESTのgit cmdです。(PS:
土曜日ティル

456

あなたはやってみたい:

git gc --prune=now

https://www.kernel.org/pub/software/scm/git/docs/git-gc.htmlを参照してください


--prune =は--prune = allと同じですか?その場合、ドキュメントはアンカーされていないオブジェクトを失う可能性があることを警告しています。アンカーされていないオブジェクトがある場合は、プルーニングの前にそれらを調整してみてください。
Assaf Israel、

3
命の恩人、ありがとう。 git pull同様のエラーメッセージで立ち往生していました。
Phil Brubaker、

4
これは、フェッチ時の「git error:cannot lock ref」例外に役立ちました。どうもありがとう!
アレクサンダー

9
これでうまくいきました。しかし、gitリモートを処理するコマンドを使用するたびに、同じコマンドを実行し続ける必要がありました。git remote prune origin一度にすべての問題を解決しました。
Keyur Golani

私の日を救った!どうもありがとう:)
Abhishek Gautam

188

これは、私のgitリモート(bitbucket.org)がIPアドレスを変更したときに起こりました。迅速な修正は、リモートを削除して再度追加することでしたが、すべてが期待どおりに機能しました。gitでリモートを削除して再度追加する方法に慣れていない場合は、次の手順に従います。

  1. 既存のリモートのSSH git URLをコピーします。次のコマンドを使用して、ターミナルに出力できます。

    git remote -v

これは次のようなものを出力します:

 origin git@server-address.org:account-name/repo-name.git (fetch)
 origin git@server-address.org:account-name/repo-name.git (push)
  1. ローカルのgitリポジトリからリモートを削除します。

    git remote rm origin

  2. リモートをローカルリポジトリに追加して戻します。

    git remote add origin git@server-address.org:account-name/repo-name.git


8
私はgit gc、git prune、rm 'lock error with file'などのすべてを試しましたが、git update server infoなどです。この答えだけがうまくいきました。時々それはWindowsの再起動のようなもので、再起動してそれは動作します。ここでも同じです。リポジトリを削除してもう一度追加すると、すべてがうまく
Marquinho Peli

12
上記の手順の後で、リモートブランチを再度追跡するようにgitに指示する必要もあります。例:git branch -u origin/master
fotinsky

これにより、.git / config内のすべてのリモート追跡情報が吹き飛ばされ、実際には機能しませんでした。
ThomasMcLeod

これも私にとってはうまくいきました。他のすべては機能しませんでした。
dondrzzy、

42

コマンドを実行してgit update-ref -d refs/heads/origin/branch修正しました。


4
リモートブランチの参照が少し異なっていたとしても、そのコマンドは私にとってもトリックを行いましたgit update-ref -d refs/remotes/origin/my_branch
。– ndeslandes

これは私にとってはうまくいきました、これは大文字小文字の区別の問題だったようです。別のgitユーザーによってオリジンにプッシュされた同じ名前の2つのブランチがあり、1つはすべて小文字で、もう1つはタイトルのケースでした。
th3uiguy

24

次のようにしてこれを修正しました

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

これは、ローカルブランチとリモートブランチが整列していて、refsエラーが致命的ではないことを前提としています。


12

上流のブランチと同じ名前のブランチにいたため、この問題が発生しました。つまり、上流のブランチが呼び出されexample-branch、私のローカルブランチが呼び出されましたexample-branch/backend。解決策は私のローカルブランチの名前を次のように変更することでした:

git branch -m <new name goes here>

12

私のために働いたのは:

  1. 削除する .git/logs/refs/remotes/origin/branch
  2. 削除する .git/refs/remotes/origin/branch
  3. 走る git gc --prune=now

1
魅力のように働いた。ファイル/フォルダ名のブランチで問題が発生している場合、それは実際にはすべてのブランチ名のファイル/フォルダを参照しています。これが役に立てば幸いです!
Ankit Kesharwani

11

これはおそらく今では解決されています。しかし、これは私のために働いたものです。

  1. ロケーション:

    • ロックされたリポジトリがサーバー側にある場合:

      1. サーバー上のgitリポジトリにSSHで接続します。
      2. リポジトリを変更し、サーバー上のリポジトリに移動する権限を持つユーザーとしてログインします。
    • ロックされたリポジトリがローカルのみの場合:

      1. gitコンソールを開き、リポジトリディレクトリに移動します。
      2. 次のコマンドを実行します。

        git update-server-info
        
  2. (リモートまたは/およびローカル)リポジトリの権限を修正する必要がある場合。私の場合は私がしなければならなかったchmod777してchownまでapache:apache

  3. ローカルリポジトリからもう一度pushしてみます。

    git push
    

7

これは私にとってそれがどのように機能するかです。

  1. サーバー上のApache DAVロックファイルを検索します(例/ var / lock / apache2 / DAVlock)
  2. 消して
  3. ウェブサーバーの書き込み権限で再作成します
  4. ウェブサーバーを再起動します

さらに高速な代替:

  1. サーバー上のApache DAVロックファイルを検索します(例/ var / lock / apache2 / DAVlock)
  2. ファイルを空にします。 cat /dev/null > /var/lock/apache2/DAVlock
  3. ウェブサーバーを再起動します

これは私の問題でした。投稿ありがとうございます。削除と権限をすべて一度に実行しました。#> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely 2014年

6

これは権限の問題のように聞こえます-2つのウィンドウを開いて、別々の権限で実行している可能性はありますか?おそらく、.gitフォルダーの所有権を確認してください。

おそらく、未解決のファイルロックが開いているかどうかを確認するか、lsofを使用して確認するか、OSに相当するものを使用します。


3

私の場合、ブランチはサブディレクトリに移動され、ディレクトリはブランチと呼ばれていました。Gitはそれによって混乱しました。ローカルブランチを削除すると(SourceTreeで右クリックで削除)、すべてが通常どおり機能しました。


3

私の場合、このメッセージが表示された後、チェックアウトコマンドを実行すると、次のメッセージが表示されました。

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

このコマンドを実行した後、通常に戻りました。



1

あなた(gitプロセス)がファイルにアクセスでき.git/info/refs、このファイルが別のプロセスによってロックされていないことを確認してください。


2
どのように確認しますか?
Iulian Onofrei 2018年

1

古いブランチの名前を含む新しい機能ブランチを作成しようとしたときに、この問題が発生しました。たとえば、origin-branch1で、branch1-featureを作成したいと思いました。それは可能ではありませんでしたが、branch1 / featureはすでにありました。


1

私の場合、リモートで削除された古いタグを手動で削除する必要がありました。


1

私の場合は、すでに作成したブランチ名に関連付けられていました。

この問題を修正するために、次のように、存在しないはずの名前のブランチを作成しました。

git checkout -b some_unknown_branch

次に、他のすべてのブランチ(アクティブではない)をクリアしました。それらは不要なごみだったからです。

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

次に、次のように、現在のブランチの名前を、意図した名前に変更しました。

git checkout -m my_desired_branch_name

0

bettercodes.orgの場合、解決策はより詩的です-唯一の問題は、プロジェクトメンバーに割り当てられた権限にある可能性があります。単純なメンバーには書き込み権限がありません!管理者権限または管理者権限を持っていることを確認してください。もちろん、これは管理者がプロジェクト設定のbettercodes.orgで設定する必要があります。


0

git filter-branchこの回答のように)多くのサブディレクトリを新しい別のリポジトリに切り離そうとすると、このエラーが発生しました)。

上記の解決策をすべて試しましたが、どれもうまくいきませんでした。最終的に、新しいブランチでタグをそれほど保存する必要がないと判断し、実行しただけです。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.