git index.lockファイルはコミットしようとすると存在しますが、ファイルを削除できません


197

「git commit」を実行すると、次のようになります。

fatal: Unable to create 'project_path/.git/index.lock': File exists.

しかし、私がそうls project_path/.git/index.lockするとき、それはファイルが存在しないと言っています。私が何をすべきかについての考えはありますか?また、project_path / .gitはrootが所有していることにも気づきました。これが私が直面している問題と関係があるかどうかはわかりません。

gitバージョンは1.7.5.4です

編集:問題は、おそらく私が実行していた別のプロセスであり、プロジェクトディレクトリに(知らないうちに)書き込みを行っていたようです。マシンを再起動したところ、問題なくコミットできました。


3
すでに存在するファイルを作成できないため、Gitが想定するアクセス許可の問題である可能性があります。ディレクトリの所有権を取得したり、sudoを使用してコマンドを実行したりしましたか?

1
git repoにアクセスする別のアプリについてのあなたの説明は正しいと思います。リベース中に同じ問題がありました。Gitxが実行されていました。終了するとgitは問題なく動作しました。
The Who

2
@asahi:回答を受け入れますか?これは将来の読者を助けるでしょう。
MERose、2015


3
@asahi:編集の内容(これが解決策でした)を回答として投稿して、それを受け入れることができます。(「マシンを再起動する」よりも一般的な解決策はありますが、別のプロセスがディレクトリにアクセスしていたことです。再起動すると、Gordianの結び目を切り抜けて、どれがなぜなのかを理解しようとします。:)私の場合、それは私のIDEでした。)とにかく、人々は彼らが自分の解決策を見つけたときに自分の質問によく答えます。
Wilson F

回答:


328

これは古い返答かもしれませんが、この解決策を必要とする次の人により役立つと思います。

linux / unix / gitbash / cygwinで、

rm -f .git/index.lock

Windowsコマンドプロンプトで、次のことを試してください。

del .git\index.lock


1
ロックファイルが自動的に削除されることがあります。なぜこのファイルを時々手動で削除する必要があるのか​​手掛かりはありますか?
Nrj

index.lockがありません。どうすればよいですか?:(
アレックスC

56
質問の問題が彼がファイルを削除できなかったということだったとすると、なぜファイルを削除しようとすることが解決策であると思いますか?
2016年

4
私にとって、SourceTreeを閉じて開くことで問題は解決しました...一時的に私はそう思います。
Andrew

1
元の質問の@skykingにはfatal: Unable to create 'project_path/.git/index.lock': File exists.、「ファイルが存在します」というエラーがあり、削除すると簡単な解決策になります。元の質問にない場合でも、なぜファイルを削除することを勧めるのですか?
Ryan S

40

Windowsの場合:

  • 管理者として開かれたPowerShellコンソールから、
> rm -Force ./.git/index.lock
  • それが機能しない場合は、すべてのgit.exeプロセスを強制終了する必要があります
> taskkill /F /IM git.exe
SUCCESS: The process "git.exe" with PID 20448 has been terminated.
SUCCESS: The process "git.exe" with PID 11312 has been terminated.
SUCCESS: The process "git.exe" with PID 23868 has been terminated.
SUCCESS: The process "git.exe" with PID 27496 has been terminated.
SUCCESS: The process "git.exe" with PID 33480 has been terminated.
SUCCESS: The process "git.exe" with PID 28036 has been terminated.
> rm -Force ./.git/index.lock

1
パラメーター名 'f'があいまいであるため、パラメーターを処理できません。
2018

おかげで、@ MikePalmice、-Forceに更新しました。彼らはAPIを変更したようです
Andrei Epure

20

Visual Studio 2015 RC(v4.6.00057)をSourceTree(v1.6.14.0)と組み合わせて実行しているWindowsプラットフォームでも、このエラーが発生します。

解決策:ソースツリーをソースコードマネージャーとして使用する場合は、次のようにVisual Studio内のソース管理プロバイダーを無効にします。

  1. 移動:ツール>オプション>ソース管理
  2. 現在のソース管理プラグインを次のように選択します:なし

私のVSはこれらのリポジトリにアクセスすることすら想定されていませんが、それでもSourceTreeでリベースするときにこれが問題でした。
Kajetan Abt

ありがとう、問題は、更新プログラム3でまだそこにある
Elger Mensonides

Visual Studioを閉じることも機能します(index.lockファイルを削除しました)
misterbee

10
  1. gitがまだ実行されているかどうかを確認します(ps -ef | grep git)
  2. そうでない場合は、ロックされたファイルを削除します
  3. はいの場合、最初にgitプロセスを終了します。

9

試す

rm -f ./.git/index.lock

他にgitプロセスを実行していない場合は、該当するプロジェクトのindex.lockファイルを削除してください。


Macの環境で作業しました。
Adam Hurwitz、

6

この問題が発生しました... Gitboxに問題がありました。それで、おそらくあなたは問題を引き起こしていたGUIを走らせていました。


GUIではありませんでしたが、プロジェクトディレクトリに書き込む別のプロセスがありました。私はそれを理解することができなかった、そしてそれは私を狂わせていた。
asahi

GitXもこの問題を引き起こしているようです。
Glutexo

6年後、それは私にとってアトムでした
ミルク

6

これは、途中で原点からのプルをキャンセルしたときに発生します。

だからあなたができることは手動で.gitディレクトリからindex.lockファイルを削除することです。

rm -f ./.git/index.lock

プロジェクトディレクトリにcdして、このコマンドを実行します。


8
質問の問題が彼がファイルを削除できなかったということだったとすると、なぜファイルを削除しようとすることが解決策であると思いますか?
2016年

+1 @skyking。ファイルの削除は明らかですが、問題は削除するファイルがないため問題が解決しないことです。
Catsunami 2018年

6
  1. この.git / index.lockファイルに影響を与える可能性のあるすべてのウィンドウを閉じます
  2. .git / index.lockファイルを削除します。
  3. コマンドラインエディターを開き、Gitファイルの場所に移動します。

(ファイルがcdからその場所に作成された場合、問題はエディターです。エディターを閉じます。このタスクでこのエディターを再度使用しないでください。別の種類のエディターを開きます-Windows Power Shellまたは単にcmd。今すぐgitコマンドを使用して続行できます)


5

たぶん(それは私にも起こりました)、lsコマンドは、現在のユーザーがそのディレクトリまたはファイルにアクセスする権限を持っていないため、存在しないと言っています。

ロックを解除し、権限の問題を回避するために適切なユーザーgitを実行していることを確認してください

sudoコマンドを使用してGNU / Linuxボックスにいる場合:

sudo rm project_path / .git / index.lock


Windowsでは、右クリック->プロパティ->属性を使用して、フォルダーが読み取り専用かどうかを確認できます。
Matt

質問の問題がファイルが存在しないことであったことを考えると、なぜファイルを削除しようとすることが解決策であると思いますか?
2016年

@skyking権限の問題でも同じエラーが表示されます。確かに、タイトルからこの質問に来ました。私は1つの可能な解決策として私の回答を書き、いくつかの投票はそれが他の人々にも起こることを確認しています;)
caligari

@caligariそうではありません。権限の問題はに別の答えを与えますls project_path/.git/index.lock
2016年

5

del .git\index.lock 私のために働いた。

masterブランチから新しいブランチをチェックアウトしているときにこの問題に直面していました。

index.lockファイルを削除した後、チェックアウトが簡単に起こりました。


4

変更を行っている間、またはおそらくサブモジュールを使用しているときに、Gitがリポジトリに関連付けられたロックファイルを作成することがあります。エラーメッセージには、ロックファイルのパスが表示されます。修正:ターミナルのパスに手動で移動し、$ rm index.lockによってロックファイルを削除します

それは役立つはずです。


4

ブランチをダブルクリックして切り替えると、SourceTreeでこの問題が発生しました。問題はあまり一般的ではなく、アトラシアンはそれを知っていますが、修正しないことにしました。

幸いなことに、解決策があります。切り替えたいブランチをダブルクリックする代わりに、右クリックして[チェックアウト[ブランチ名]]を選択するだけです。今は成功するはずです。


おかげで、右クリック>チェックアウトは代替として機能します。特にindex.lockが存在しない場合、エラーメッセージはかなり誤解を招きます。
Ernest

4

私はまったく同じシナリオに遭遇しました。私もローカルコードに変更を加えていません。ファイルを編集して元に戻しました。非表示の.gitフォルダーにある以下のファイルを削除しただけです。出来た!

project_path / .git / index.lock


3

実際にrootがリポジトリを所有することを意図していない限り、これは誤ってGitコマンドをrootとして実行したようです(たぶん最初のclone / initでさえも)。そうするつもりなら、リポジトリとしてrootとしてすべてのGitコマンドを実行する必要があります。そうでない場合は、実行sudo chown your-user[:your-group] -R .gitしてその所有権を取得し、問題が発生するかどうかを確認します。


私の場合、内部のファイルとディレクトリのモードをめちゃくちゃにして.git修正しました:find .git -type f -exec chmod 644 {} \;またfind .git -type d -exec chmod 755 {} \;、gitプロジェクトをあるコンピューターから別のコンピューターに移動するときにモードをめちゃくちゃにしました
user3405291

私の場合、.gitファイルに書き込み権限を追加しましたsudo chmod g+w .git -R
Beatriz Fonseca

2

同じローカルリポジトリで作業している複数のgitクライアントがそのロックをめぐって競合します。各クライアントは、相手がロックを解除するまで待機して、善良な市民になる必要があります。私たちにとって、大きなコミットスクリプトを実行している間、SourceTreeまたはMSVSがバックグラウンドで何らかのメンテナンスを行っているように見えます。

おそらく、 'git'自体が再試行をサポートするために '--retriesWhenLocked 5'引数をサポートする必要があります。手動で実行した場合、デフォルトでこれに設定されます。

これは、「gitr」という名前のgitを囲むPowerShellラッパーで、index.lockが消えるまで再試行します。デフォルトは5回、それぞれの間隔は3秒です。ユーザーが介入する必要があると想定して、index.lockを削除することはありません。より大きなコミットスクリプトから抽出されました。単純な引数を使用した最小限のテストしかありません。

  • スクリプトをC:\ binにコピーし、C:\ binを$ PATHに追加します。
  • PS1から> gitr --help
  • DOS%> powershell gitr --helpから

gitr.ps1

    #requires -version 2
    <#
    .SYNOPSIS
        gitr
    .DESCRIPTION
        Run "git" as an external process with retry and capturing stdout stderr.
    .NOTES  
      2017/05/16 crokusek: Initial version
    #>

    #---------------------------------------------------------[Initializations]--------------------------------------------------------

    #Set Error Action 
    $ErrorActionPreference = "Stop";

    #----------------------------------------------------------[Declarations]----------------------------------------------------------

    $scriptDir = Split-Path $script:MyInvocation.MyCommand.Path
    #Set-Location $scriptDir

    ## Disabled logging
    # Log File 
    # $logFile = "$($scriptDir)\getr.log"
    # If (Test-Path $logFile) { Clear-Content $logFile }

    #-----------------------------------------------------------[Functions]------------------------------------------------------------

    Function Log([string]$msg, [bool]$echo = $true)
    {
        $timestamp = "$(get-date -Format 'yyyy/MM/dd HH:mm:ss'):  " 
        $fullmsg = $msg -replace '(?ms)^', $timestamp  # the (?ms) enables multiline mode

        ## Disabled Logging 
        # Add-content $LogFile -value $fullmsg

        if ($echo)
        {
            Write-Host $msg
        }
    }

    Function ExecSimple([string]$command, [bool]$echo=$true, [bool]$stopOnNonZeroExitCode=$true)
    {
        $command, $args = $command -split " "
        return Exec $command $args $echo $stopOnNonZeroExitCode
    }

    Function Exec([string]$exe, [string[]]$arguments, [bool]$echo=$true, [bool]$stopOnNonZeroExitCode=$true)
    {   
        # Passing $args (list) as a single parameter is the most flexible, it supports spaces and double quotes

        $orgErrorActionPreference = $ErrorActionPreference 
        Try
        {           
            $error.clear()  # this apparently catches all the stderr pipe lines

            if ($false -and $exe -eq 'git')  # todo make this a generic flag
            {
                $exe = "$($exe) 2>&1"
            }

            $output = ""

            $argflattened = $arguments -join ' '
            Log "`n% $($exe) $($arguments)`n"

            # This way some advantages over Invoke-Expressions or Start-Process for some cases:
            #      - merges stdout/stderr line by line properly, 
            #      - echoes the output live as it is streamed to the current window,
            #      - waits for completion
            #      - works when calling both console and windows executables.
            #       
            $ErrorActionPreference = "Continue"  # required in order to catch more than 1 stderr line in the exception

            if ($echo)
            {
                # Using "cmd.exe" allows the stderr -> stdout redirection to work properly.  Otherwise the 2>&1 runs after PS for 
                # some reason.  When a command such as "git" writes to stderr, powershell was terminating on the first stderr 
                # line (and stops capturing additional lines).
                #
                # but unfortuantely cmd has some bizarre de-quoting rules that weren't working for all cases. 
                #& cmd /c "`"" $exe $arguments "`"" | Tee-Object -variable output | Write-Host | out-null           

                # This is simplest but has some issues with stderr/stdout (stderr caught as exception below)
                #
                & $exe $arguments 2>&1 | tee -variable output | Write-Host | out-null 
            }
            else
            {           
                & $exe $arguments 2>&1 | tee -variable output | out-null 
            }

            $output = $output -join "`r`n"                  

            if ($stopOnNonZeroExitCode -and !$LASTEXITCODE -eq 0)
            {           
                throw [System.Exception] "Exit code ($($LASTEXITCODE)) was non-zero. Output:`n$($output)"
            }       
        }
        catch [System.Management.Automation.RemoteException]
        {
            $output = $_.Exception.ToString().Replace("System.Management.Automation.RemoteException:", "").Trim()

            if ($output.Contains("fatal")) 
            {
                throw 
            }

            if ($echo)
            {
                Log $output
            }
        }
        finally
        {
            $ErrorActionPreference = $orgErrorActionPreference;
        }

        if (-not $output -eq "")
        {
            Log $output $false  # don't echo to screen as the pipe above did    
        }

        return $output
    }

    Function ExecWithRetry([string]$exe, [string[]]$arguments, [bool]$echo=$true, [bool]$stopOnNonZeroExitCode=$true, 
                          [int]$maxRetries = 5, [int]$msDelay = 3000, [AllowNull()][string]$exceptionMustContain = $null)
    {
        for ($i = 0; $i -lt $maxRetries; $i++)
        {
            try
            {
                Exec $exe $arguments $echo $stopOnNonZeroExitCode
                return
            }
            catch
            {
                if (-not [string]::IsNullOrEmpty($exceptionMustContain) -and $_.Exception.ToString().Contains($exceptionMustContain))
                {
                    Log "Last Error from $($exe) is retryable ($($i + 1) of $($maxRetries))" $true
                    Start-Sleep -Milliseconds ($msDelay);
                    continue
                }

                throw
            }
        }

        throw [System.Exception] "Unable to successfully exec '$($exe)' within $($maxRetries) attempts."
    }

    Function GitWithRetry([string[]]$arguments, [bool]$echo=$true)
    {
        ExecWithRetry "git" $arguments $echo -exceptionMustContain "Another git process seems to be running"
    }

#-----------------------------------------------------------[Main]------------------------------------------------------------

function Main([string[]]$arguments)
{   
    GitWithRetry @($arguments)
}


#-------------------------------------- Startup ------------------------------------
try 
{
    Main $args
    Exit 0
}    
catch
{
    #Log "*** A fatal error occured: $($_.Exception)"
    #Read-Host -Prompt "`nA fatal error occurred, press enter to close."    
    exit 1
}

2

Windows 10でもこの質問があります。

デルを試してみると./.git/index.lockcannot remove 'index.lock': Device or resource busy

私は最終的に理由を得ました:

コンピューターにはgitを使用する2つのプロセスがあります。

  • git bash
  • cmder

git commitエラーが発生するため、cmder.exeを使用します。

だからソリューションが使用されているgit bashか終了してgit bashから、cmder.exeを使用してください


1

これとまったく同じエラーが発生しましたが、問題はロックファイルではありませんでした。代わりに、別のgitリポジトリの内容をこのリポジトリにコピーしました(.git非表示フォルダーを含む)。そのため、SourceTreeはファイルをステージングしたいレポについて混乱していました(レポSourceTreeが自分がいると思っていたものと、埋め込まれた.git dirの内容が入っていると言っていたものとの間に不一致がありました)。


1

WindowsでCygwinを使用するTortoiseGitでこの問題が発生しました。管理者権限でも削除./.git/index.lockを削除できませんでした。Cygwinとコマンドプロンプトの両方を試しましたが、ファイルが別のプロセスで使用されていると表示されました。

TortoiseProc.exeの2つのインスタンスが実行されていることがわかりました。それらの1つを強制終了し、すべてのウィンドウエクスプローラウィンドウを閉じたところ、ファイルを削除できました。TortoiseProc.exeのインスタンスを強制終了することが解決策なのか、ウィンドウエクスプローラーウィンドウが閉じられたのかはわかりません。


1

私の解決策は、.indexファイルを削除して、Gitが別のファイルを再構築できるようにすることでした。


1

削除するinex.lockファイルはありませんでしたが、私にとっては、フォルダーの[プロパティ]ダイアログの[属性]ウィンドウから読み取り専用チェックを削除することができました。




1

私のsourceTreeアプリケーションでは、コミットしたり、他のコミット/ブレークに切り替えることができません。その時のようなエラーが表示されます

致命的:何とか何とか何とか作成することができません。

私は単にgoto .gitフォルダー(プロジェクトエクスプローラーのディレクトリ内)でこれを解決します。そして、インデックスを削除します----- [ファイルタイプ:LOCKファイル]。これで、sourceTreeのすべてのアクセス権を取得します。

インデックスロックファイルを確認してください。ファイルの種類を取得できない場合は、コンピューターのfileview設定を変更してください。注:.gitフォルダーは通常、隠しフォルダーのタイプです。


1

私にとってそれは何でしたか:

git rebase --abort リベースを再起動します。

アンドリューは述べ、これが起こったとき、私はまたPHPStormを使用していました。でもそれを閉じる必要はなかった。


1

まず、プロジェクトの特定のフォルダーに移動する必要があります。プロジェクト名がFirstprojectの場合と同様に、まずプロジェクトのディレクトリに移動します。次にcd .gitと入力し、gitフォルダーに移動した後、del index.lockと入力します。 index.lock ..ファイルの削除以前と同じようにコミットしてプッシュすることができます


1

私の場合、完全にシャットダウンするのではなく、ウィンドウでした。

Windowsは休止状態で、マウントを拒否されています

Windowsが本当に休止状態になっている可能性があります。通常シャットダウンするように指示すると、Windowsは自動的にこれを行います。利点は、見かけ上の起動時間が短縮されることです。

休止状態にせずにWindowsをシャットダウンするには、コマンドプロンプト(Windowsの場合)で次のコマンドを発行します。

shutdown /s

/t 0すぐにシャットダウンするためにincludeすることもできます。

このためのランチャーを設定するための素晴らしいチュートリアルを見つけました:ハイブリッドブートを無効にせずにWindows 8で完全シャットダウンを実行する方法。

Windowsを実際にシャットダウンするより簡単な方法は、(「シャットダウン」ではなく)「再起動」することですが、その後、ブートプロセスをインターセプトし、Windowsをブートさせる代わりにLinuxをブートします。

クレジットnobar


1

これは、ハブなどの代替コマンドラインgitクライアントを使用している場合にも発生する可能性があります

ハブをgitのエイリアスの代替として数年使用してきましたが、最近、一連のgitを実行するbashスクリプトを作成し、このインデックスロックの問題が発生し始めました。

gitの代わりにハブを実行していることを思い出すまで、修正は見つかりませんでした。私はそれを削除し、問題は消えました!


0

エラーを取得する:

Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
fatal: Unable to create '/home/user/project/.git/index.lock': File exists.

If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.

しかし、その.git / index.lockファイルを見つける(または削除する)ことができませんでした。

私の場合、git-colaが実行されていました。

それは明らかに時々その.git / index.lockを作成するか、コマンドラインで実行していたリベースが原因でそのエラーを受け取ったためです-git-colaは明らかにGitのコマンドライン実行を「妨害」します(またはいくつかのGit CLI操作)。

これは、コマンドラインgit rebaseの実行中にgit-colaを閉じることで解決します。


0

複数インストールされている場合、別のGitクライアントが干渉することがあります。

つまり。タスクマネージャで確認してくださいまたはGet-ProcessそのTGitCacheTortoiseGitからは、バックグラウンドでアクティブではありません。


0

最近同じ問題がありました。エラーメッセージ全体をチェックすると、gitプロセスを使用しているプロセスがあり、index.lockの削除をブロックしていることも示されます。Visual Studioやgitが統合されている関連ソフトウェアのようにIDEを開いている場合があります。それを閉じて、ファイルを再度保存してみてください。それが役に立てば幸い。

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