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이 루트가 소유하고 있음을 알았습니다. 루트가 발생한 문제와 관련이 있는지 확실하지 않습니다.

자식 버전은 1.7.5.4입니다

편집 : 문제는 아마도 내가 실행중인 다른 프로세스, 아마도 프로젝트 디렉토리에 (나에게 알려지지 않은) 프로세스 인 것 같습니다. 컴퓨터를 다시 시작한 다음 커밋하는 데 아무런 문제가 없었습니다.


3
Git이 파일을 만들 수 없으므로 이미 존재한다고 가정하는 경우 권한 문제 일 수 있습니다. 디렉토리의 소유권을 가져 오거나 sudo를 사용하여 명령을 실행하려고 했습니까?

1
git repo에 액세스하는 다른 앱에 대한 귀하의 설명이 정확하다고 생각합니다. 리베이스 중에 같은 문제가있었습니다. Gitx가 실행 중입니다. 종료하면 자식이 잘 작동했습니다.
누가

2
@asahi : 당신은 아마 대답을 받아들이고 싶습니까? 이것은 미래 독자들을 도울 것입니다.
MERose

2
가능한 Git
Kristján

3
@asahi : 편집 내용 (솔루션)을 답변으로 게시 한 다음 수락 할 수 있습니다. ( '컴퓨터를 다시 시작하는 것'보다 더 일반적인 해결책이지만 다른 프로세스가 디렉토리에 액세스하고 있다는 것입니다. 다시 시작하면 Gordian 매듭을 통해 어느 것을 왜 알아낼 지 알 수 있습니다. :) 내 경우에는 내 IDE였습니다.) 어쨌든 사람들은 자신의 솔루션을 찾을 때 자주 자신의 질문에 대답합니다.
Wilson F

답변:


327

이것은 오래된 답변 일지 모르지만 다음에이 솔루션이 필요한 사람에게 더 유용 할 것으로 기대합니다.

linux / unix / gitbash / cygwin에서 시도하십시오

rm -f .git/index.lock

Windows 명령 프롬프트에서 다음을 시도하십시오.

del .git\index.lock


1
때로는 잠금 파일이 자동으로 삭제되는 것을 볼 수 있습니다. 이 파일을 수동으로 삭제해야하는 이유는 무엇입니까?
Nrj

index.lock이 없습니다. 무엇입니까? :(
Alex C

56
문제의 문제는 그가 파일을 삭제할 수 없다는 점을 감안할 때 왜 파일을 삭제하려고 시도하는 것이 해결책이라고 생각합니까?
skyking

4
나를 위해 SourceTree를 닫고 열면 문제가 해결되었습니다 ... 일시적으로 생각합니다.
앤드류

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'가 모호하여 매개 변수를 처리 할 수 ​​없습니다.
3pitt

감사합니다, @ 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. 자식이 여전히 실행 중인지 확인 (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 년 후, 그것은 나를위한 원자였습니다
Milk

6

이것은 중간에서 원점에서 당기기를 취소 할 때 발생합니다.

그래서 당신이 할 수있는 일은 .git 디렉토리에서 index.lock 파일을 수동으로 삭제하는 것입니다.

rm -f ./.git/index.lock

CD를 프로젝트 디렉토리에 넣고이 명령을 실행하십시오.


8
문제의 문제는 그가 파일을 삭제할 수 없다는 점을 감안할 때 왜 파일을 삭제하려고 시도하는 것이 해결책이라고 생각합니까?
skyking

@skyking +1 파일을 삭제하는 것은 명백합니다. 문제는 삭제할 파일이없고 문제가 지속된다는 것입니다.
Catsunami

6
  1. 이 .git / index.lock 파일에 영향을 줄 수있는 모든 창을 닫으십시오
  2. .git / index.lock 파일을 삭제하십시오.
  3. 명령 행 편집기를 열고 git 파일의 위치로 cd하십시오.

(파일이 CD에서 해당 위치로 작성되면 문제는 편집기입니다. 편집기를 닫으십시오.이 작업에이 편집기를 다시 사용하지 마십시오. 다른 종류의 편집기 (Windows power shell 또는 cmd)를여십시오. git 명령을 사용하여 계속할 수 있습니다)


5

아마도 (나에게 일어난 일) ls 명령은 현재 사용자에게 해당 디렉토리 또는 파일에 액세스 할 수있는 권한 없기 때문에 존재하지 않는다고 말합니다 .

권한 문제를 피하기 위해 잠금을 제거하고 올바른 사용자git을 실행하고 있는지 확인하십시오 .

sudo 명령 을 사용하여 GNU / Linux 상자에있는 경우 :

sudo rm project_path / .git / index.lock


Windows에서는 마우스 오른쪽 단추 클릭-> 속성-> 속성으로 폴더가 읽기 전용인지 확인할 수 있습니다.
Matt

문제의 문제는 파일이 존재하지 않는다는 점을 감안할 때 왜 파일을 삭제하려고 시도하는 것이 해결책이라고 생각합니까?
skyking

@skyking 권한 문제는 같은 오류를 보여줍니다. 실제로 제목 때문에이 질문에 왔습니다. 나는 하나의 가능한 해결책으로 내 대답을 썼고 일부 투표는 그것이 다른 사람들에게도 발생한다는 것을 확인합니다.)
caligari

@caligari 정확하지 않습니다. 권한 문제는에 대한 또 다른 답변을 제공합니다 ls project_path/.git/index.lock.
11:00에

5

del .git\index.lock 나를 위해 일했다.

마스터 지점에서 새 지점을 체크 아웃하는 동안이 문제에 직면했습니다.

index.lock파일 을 삭제 한 후 쉽게 체크 아웃했습니다 .


4

때때로 Git은 변경을하거나 하위 모듈을 사용할 때 repo와 관련된 잠금 파일을 만듭니다. 오류 메시지는 잠금 파일의 경로를 보여줍니다. 수정 : 터미널의 경로로 수동 이동하여 $ rm index.lock으로 잠금 파일을 삭제하십시오.

도움이 될 것입니다.


4

분기를 두 번 클릭하여 전환 할 때 SourceTree 에서이 문제가 발생했습니다. 이 문제는 흔하지 않으며 Atlassian은 이에 대해 알고 있지만 문제를 해결하지 않기로 결정했습니다.

다행히도 해결책이 있습니다. 전환하려는 지점을 두 번 클릭하는 대신 마우스 오른쪽 버튼을 클릭하고 "[지점 이름] 체크 아웃"을 선택하십시오. 지금 성공해야합니다.


감사합니다. 마우스 오른쪽 버튼 클릭> 결제가 대안으로 작동합니다. index.lock이 존재하지 않는 경우 특히 오류 메시지가 잘못 표시됩니다.
어니스트

4

나는 똑같은 시나리오를 보았습니다. 심지어 내 지역 코드를 변경하지 않았습니다. 방금 파일을 편집하고 되돌 렸습니다. 숨겨진 .git 폴더에서 아래 파일을 삭제했습니다. 효과가 있었다!

project_path / .git / index.lock


3

실제로 root를 사용하여 repo를 소유하지 않으려는 경우 실수로 Git 명령을 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 프로젝트를 한 컴퓨터에서 다른 컴퓨터로 옮길 때 모드를 엉망으로
만들었습니다.

제 경우에는 .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.lock, 그것은 나에게 말했다cannot remove 'index.lock': Device or resource busy

나는 그 이유를 마침내 얻었다 :

컴퓨터에는 git을 사용하는 두 가지 프로세스가 있습니다.

  • 자식 배쉬
  • cmder

그래서 cmder.exe를 사용 git commit하면 오류가 발생합니다.

해결책은 사용 git bash중이거나 종료 한 git bash다음 cmder.exe를 사용하십시오.


1

나는이 똑같은 오류가 있었지만 문제는 잠금 파일이 아닙니다. 대신 문제는 .git invisible 폴더를 포함하여 다른 git repo의 내용을이 repo에 복사했다는 것입니다. 그래서 SourceTree는 파일을 스테이징하려는 리포지토리에 대해 혼란 스러웠습니다.


1

Windows의 Cygwin이있는 TortoiseGit 에이 문제가있었습니다. 관리자 권한으로도 remove ./.git/index.lock을 삭제할 수 없었습니다. Cygwin과 명령 프롬프트를 모두 시도했지만 파일이 다른 프로세스에서 사용 중이라고 말했습니다.

TortoiseProc.exe 인스턴스가 2 개 실행되고 있음을 발견했습니다. 나는 그중 하나를 죽이고 모든 Windows 탐색기 창을 닫은 다음 파일을 삭제할 수있었습니다. TortoiseProc.exe의 인스턴스를 죽이는 것이 해결책인지 아니면 창 탐색기 창을 닫는 것인지 모르겠습니다.


1

나를위한 해결책은 .index 파일을 삭제하고 Git이 다른 파일을 다시 작성하도록하는 것입니다.


1

삭제할 inex.lock 파일이 없지만 폴더 속성 대화 상자의 속성 창에서 읽기 전용 검사를 제거하는 것이 효과적이었습니다.




1

내 sourceTree 응용 프로그램에서 커밋을 수행하거나 다른 커밋 / 차단으로 전환 할 수 없습니다. 그 시간은 같은 오류를 보여줍니다

치명적인 : blah blah blah를 만들 수 없습니다 ..

단순히 프로젝트 탐색기 Dir의 goto .git 폴더 로이 문제를 해결합니다. 그리고 Index ----- [file type : LOCK file]을 삭제하십시오. 이제 sourceTree에서 모든 액세스 권한을 다시 얻습니다.

색인 잠금 파일을 확인하십시오. 파일 형식을 얻지 못하면 컴퓨터에서 파일보기 설정을 변경하십시오. 참고 : .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즉시 종료를 포함 할 수도 있습니다 .

하이브리드 부팅을 비활성화하지 않고 Windows 8에서 전체 종료를 수행하는 방법에 대한 실행기를 설정하는 좋은 자습서를 찾았습니다.

실제로 Windows를 종료하는 가장 간단한 방법은 '종료'가 아닌 '다시 시작'하는 것이지만 부팅 프로세스를 가로 채고 Windows를 부팅하는 대신 Linux를 부팅하는 것입니다.

크레딧 : nobar


1

hub 와 같은 대체 명령 줄 git 클라이언트를 사용하는 경우에도 발생할 수 있습니다 .

나는 허브를 2 년 동안 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을 가끔씩 생성하거나 명령 줄에서 수행 한 rebase에 의해 발생하고 그 오류가 발생하는 동안 발생합니다 .git-cola는 분명히 Git의 명령 줄 실행을 "방해"합니다 (또는 일부 Git CLI 작업).

이것은 커맨드 라인 git rebase 중에 git-cola를 닫으면 해결됩니다.


0

여러 개의 Git 클라이언트가 여러 개 설치되어있는 경우 때때로 방해가 될 수 있습니다.

즉. 작업 관리자와 확인 또는 Get-ProcessTGitCacheTortoiseGit에서 백그라운드에서 활성화되어 있지 않습니다.


0

최근에 같은 문제가 발생했습니다. 전체 오류 메시지를 확인하면 index.lock을 삭제하지 못하게하는 git 프로세스를 사용하는 프로세스가 있음을 나타냅니다. Visual Studio 또는 git이 통합 된 관련 소프트웨어와 같은 IDE가 열려있을 수 있습니다. 파일을 닫고 파일을 다시 고정하십시오. 도움이 되길 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.