programing

Git index.lock File은 커밋하려고 할 때 존재하지만 파일을 삭제할 수 없습니다.

lastmoon 2023. 6. 21. 22:54
반응형

Git index.lock File은 커밋하려고 할 때 존재하지만 파일을 삭제할 수 없습니다.

git commit'을 실행하면 다음과 같은 메시지가 나타납니다.

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

가 만지하를 할 때, 내할때.ls project_path/.git/index.lock파일이 존재하지 않는다는 것입니다.어떻게 해야 하나?또한 project_path/.git가 루트에서 소유하고 있으며, 현재 발생하고 있는 문제와 관련이 있는지 잘 모르겠습니다.

Git 버전은 1.7.5.4입니다.


문제는 제가 실행 중인 다른 프로세스, 즉 프로젝트 디렉토리에 (알 수 없는) 쓰는 것이었던 것 같습니다.저는 제 기계를 다시 시작했고 그 다음에는 실행하는 데 문제가 없었습니다.

Linux, Unix, Git Bash 또는 Cygwin에서 다음을 시도합니다.

rm -f .git/index.lock

Windows 명령 프롬프트에서 다음을 시도합니다.

del .git\index.lock

Windows의 경우:

  • 관리자로 열린 PowerShell 콘솔에서 다음을 시도합니다.

    rm -Force ./.git/index.lock
    
  • 그게 안 되면, 당신은 모든 깃을 죽여야 합니다.exe 프로세스

    taskkill /F /IM git.exe
    

    SUCCESS:의 "되었습니다.PID 20448의 "git.exe" 프로세스가 종료되었습니다.
    SUCCESS:의 "되었습니다.PID 11312의 "git.exe" 프로세스가 종료되었습니다.
    SUCCESS: 의 "되었습니다.PID 23868의 "git.exe" 프로세스가 종료되었습니다.
    SUCCESS: 의 "되었습니다.PID 27496의 "git.exe" 프로세스가 종료되었습니다.
    SUCCESS: 의 "되었습니다.PID 33480의 "git.exe" 프로세스가 종료되었습니다.
    SUCCESS: 의 "되었습니다.PID 28036의 "git.exe" 프로세스가 종료되었습니다.\

    rm -Force ./.git/index.lock
    

Visual Studio 2015 RC(v4.6.00057)를 Sourcetree(v1.6.14.0)와 함께 실행하는 Windows 플랫폼에서도 이 오류가 발생합니다.

솔루션:소스 트리를 소스 코드 관리자로 사용하려면 Visual Studio에서 다음과 같이 소스 제어 공급자를 사용하지 않도록 설정하면 됩니다.

  1. 이동: 메뉴 도구 → 옵션소스 컨트롤로 이동합니다.
  2. 현재 소스 제어 플러그인을 없음으로 선택합니다.

해라

rm -f ./.git/index.lock

실행 중인 다른 Git 프로세스가 없는 경우 각 프로젝트의 index.lock 파일을 삭제합니다.

  1. 실행합니다(Git 프로가확중인니다합지인행실스속세계(▁check다▁if▁stillg니▁the▁(▁running합확ps -ef | grep git)
  2. 그렇지 않으면 잠긴 파일을 제거합니다.
  3. 만약 그렇다면, 먼저 Git 프로세스를 종료합니다.
  1. .git/index.lock 파일에 영향을 줄 수 있는 모든 창을 닫습니다.
  2. .git/index.lock 파일을 삭제합니다.
  3. 명령줄 편집기를 열고 Git 파일 위치로 이동합니다.

cd에서 해당 위치로 파일을 만들면 편집기가 문제입니다.편집기를 닫습니다.이 작업에 이 편집기를 다시 사용하지 마십시오.다른 종류의 편집기(Windows PowerShell 또는 단순히 cmd)를 엽니다.이제 Git 명령을 사용하여 계속할 수 있습니다.)

방금 이 문제로...깃박스는 잘못이 있었습니다.문제를 일으키는 GUI를 실행했을 수도 있습니다.

중간에 원점에서 풀링을 취소하면 이런 일이 발생합니다.

따라서 .git 디렉터리에서 index.lock 파일을 수동으로 삭제할 수 있습니다.

rm -f ./.git/index.lock

cd를 프로젝트 디렉토리에 넣고 이 명령을 실행합니다.

del .git\index.lock저를 위해 일했습니다.

는 마스터 지점에서 새로운 지점을 확인하는 동안 이 문제에 직면했습니다.

삭제 후 쉽게 체크아웃할 수 있습니다.index.lockjava.

현재 사용자에게 해당 디렉터리나 파일에 액세스할 수 있는 권한이 없기 때문에 ls 명령어 존재하지 않는다고 말하는 것 같습니다.

잠금을 제거하고 권한 문제를 방지하기 위해 올바른 사용자와 함께 Git를 실행하고 있는지 확인합니다.

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

sudo rm project_path/.git/index.lock

저 같은 경우에는 간단히 다음으로 이동합니다.project_path/.gitindex.lock 파일을 삭제합니다.코드를 누르면 작동합니다.

때때로 Git는 변경하는 동안 또는 아마도 하위 모듈을 사용하는 동안 당신의 레포와 연결된 잠금 파일을 만듭니다.

오류 메시지에 잠금 파일의 경로가 표시됩니다.

수정: 터미널의 경로로 수동으로 이동하여 잠금 파일을 삭제하기만 하면 됩니다.

rm index.lock

도움이 될 겁니다.

분기를 두 번 클릭하여 전환할 때 소스 트리에 문제가 발생했습니다.이 문제는 그리 흔하지 않고 아틀라스 사람들도 이 문제에 대해 알고 있지만, 그들은 이 문제를 고치지 않기로 결정했습니다.

다행히 해결책이 있습니다.전환할 분기를 두 번 클릭하는 대신 마우스 오른쪽 단추를 눌러 "Checkout [지점 이름]"을 선택합니다.이제는 성공해야 합니다.

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

project_path/.git/index.lock

실제로 저장소를 소유하기 위해 루트를 의도한 것이 아니라면 실수로 Git 명령을 루트로 실행한 것처럼 들립니다(초기 클론/init도 가능).만약 당신이 그것을 의도했다면, 당신은 저장소의 모든 Git 명령을 루트로 실행하면서 살아야 할 것입니다.그렇지 않았다면, 도망쳐요.sudo chown your-user[:your-group] -R .git그것의 소유권을 가지고, 그리고 나서 일이 잘 돌아가는지 확인하는 것.

저는 오늘 소스 트리를 닫은 후에도 계속 실행되는 여러 Git 프로세스를 생성한 이 문제에 부딪혔습니다.제가 고친 방법은 이렇습니다.

  1. + +를 누르거나 창에서 "작업 관리자"를 입력하여 작업 관리자를 시작합니다.
  2. 아래 스크린샷과 같이 "git", "git-lfs" 등의 이름을 가진 모든 프로세스를 찾습니다.마우스 오른쪽 버튼을 클릭하고 "프로세스 종료"를 선택하여 각 프로세스를 종료합니다.
  3. .git/index.lock 파일을 삭제합니다.

Screenshot of Task Manager, including some Git processes

git 2.8.4(2016년 6월)부터는 더 이상 이런 일이 없어야 합니다.

문제 755를 참조하여 문제를 완화해야 합니다(commit 2db0641).

임시 파일 핸들이 하위 프로세스에 의해 상속되지 않는지 확인

가 하위프스가다핸상음들못합다니록하도속지하에 하지 못하도록 .index.lock.

당신의 코드가 Dropbox가 동기화하고 있는 디렉토리에 있습니까?Dropbox를 일시 중지합니다.

계속 같은 상태가 되었지만 Dropbox(인터페이스에서 30분, 1시간, ...)를 일시 중지하면 다시는 그런 일이 발생하지 않습니다.

Windows 10(윈도우 10)에서도 이 질문이 있습니다.

내가 델을 시도했을 때./.git/index.lock그것은 나에게 말했습니다.cannot remove 'index.lock': Device or resource busy.

드디어 이유를 알게 되었습니다.

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

cmder를 사용했습니다.하기 위한 exegit commit오류가 발생했습니다.

따라서 해결책은 Git Bash를 사용하거나 Git Bash를 종료한 다음 cmder.exe를 사용하는 것입니다.

동일한 로컬 리포지토리에서 작업하는 여러 Git 클라이언트가 해당 잠금을 놓고 경쟁합니다.각 고객은 상대방이 잠금을 해제할 때까지 기다려야 좋은 시민이 될 수 있습니다.대규모 커밋 스크립트를 실행하는 동안에는 소스 트리 또는 Visual Studio가 백그라운드에서 약간의 유지보수를 수행하는 것으로 보입니다.

아마도 'git' 자체가 '--재시도'를 지원해야 할 것입니다.재시도를 지원하는 WhenLocked 5' 인수입니다.수동으로 실행할 경우 기본값으로 설정할 수도 마찬가지입니다.

여기 Git 주위에 있는 "gitr"이라는 PowerShell 래퍼가 있습니다. 이 래퍼는 index.lock이 사라질 까지 각각 3초 간격으로 기본 5번의 시도를 사용하여 재시도합니다.사용자가 개입해야 한다고 가정하면 index.lock은 제거되지 않습니다.더 큰 커밋 스크립트에서 추출되었습니다.간단한 인수를 사용하여 최소한의 테스트만 수행합니다.

  • 스크립트를 C:\bin에 복사하고 C:\bin을 $PATH에 추가합니다.
  • PowerShell에서:gitr --help
  • DOS(cmd.exe)에서: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
}

해결책은 .index 파일을 삭제하고 Git가 다른 파일을 다시 빌드할 수 있도록 하는 것이었습니다.

삭제할 inx.lock 파일이 없었지만, 폴더 속성 대화상자의 속성 창에서 읽기 전용 확인란을 제거하는 것이 제게 효과적이었습니다.

저도 똑같은 오류가 있었지만, 문제는 잠금 파일이 아니었습니다.대신 다른 Git 저장소의 내용을 .git invisible 폴더를 포함하여 이 저장소에 복사한 것이 문제였습니다.

그래서 소스 트리는 파일을 스테이징할 저장소(내가 있다고 생각한 저장소와 내장된 .git 디렉터리의 내용이 있어야 한다고 말한 저장소가 일치하지 않음)에 대해 혼란스러워했습니다.

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

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

index.lock 파일을 만들고 Windows 명령을 사용하여 파일을 삭제했습니다.

소스 트리 응용 프로그램에서 커밋을 수행하거나 다른 커밋/분기로 전환할 수 없습니다.그때는 다음과 같은 오류를 보여줍니다.

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

프로젝트 탐색기 디렉토리의 .git 폴더로 이동하여 이 문제를 해결합니다.인덱스([파일 유형: LOCK 파일])를 삭제합니다.이제 소스 트리의 모든 접근 권한을 되찾았습니다.

인덱스 잠금 파일을 확인하십시오...파일 형식이 표시되지 않는 경우 컴퓨터의 파일 보기 설정을 변경합니다.참고: .git 폴더는 일반적으로 숨겨진 유형의 폴더입니다.

제게 도움이 된 것은:

git rebase --abort리베이스를 다시 시작합니다.

Andrew가 언급했듯이, 저도 PphpStorm을 사용하고 있었습니다.하지만 닫을 필요는 없었어요.

먼저 프로젝트의 특정 폴더로 이동해야 합니다.프로젝트 이름이 First project인 경우 먼저 프로젝트 디렉토리로 이동합니다.

다음 입력cd .git.

그런 다음 Git 폴더로 이동한 후 다음을 입력합니다.del index.lock파일 index.lock을 삭제한 후에는 이전과 같이 커밋하고 푸시할 수 있습니다.

저의 경우 삭제할 index.lock 파일이 없었습니다.나는 Pretty와 포맷 후 109개의 파일을 커밋하려고 했습니다.그 시점에 더 적은 파일을 커밋하는 것이 결국 문제를 "해결"한 것입니다.

저의 경우, 완전히 종료된 것이 아니라 Windows였습니다.

Windows가 최대 절전 모드로 설정되어 있으며 탑재가 거부되었습니다.

Windows(윈도우)가 실제로 최대 절전 모드로 전환되었을 가능성이 있습니다.정상적으로 종료하라는 메시지가 표시되면 Windows(윈도우)에서 이 작업을 자동으로 수행합니다.이점은 시작 시간이 빨라진다는 것입니다.

최대 절전 모드를 사용하지 않고 Windows를 종료하려면 명령 프롬프트에서 다음을 실행합니다(Windows의 경우).

shutdown /s

다음을 포함할 수도 있습니다./t 0즉시 종료할 수 있습니다.

런처를 설정할 수 있는 좋은 튜토리얼을 찾았습니다.하이브리드 부팅을 비활성화하지 않고 Windows 8에서 전체 종료를 수행하는 방법.

Windows(윈도우)를 실제로 종료하는 더 간단한 방법은 '셧다운'이 아닌 '재시작'이지만 부팅 프로세스를 가로채고 Windows(윈도우)를 부팅하는 대신 Linux를 부팅하는 것입니다.

신용: 노바

언급URL : https://stackoverflow.com/questions/9282632/git-index-lock-file-exists-when-i-try-to-commit-but-i-cannot-delete-the-file

반응형