File index.lock git ada ketika saya mencoba melakukan, tetapi tidak dapat menghapus file


197

Ketika saya melakukan 'git commit', saya mendapatkan yang berikut:

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

Namun, ketika saya melakukannya ls project_path/.git/index.lockmengatakan file tersebut tidak ada. Adakah pemikiran tentang apa yang harus saya lakukan? Saya juga memperhatikan bahwa project_path / .git dimiliki oleh root, tidak yakin apakah itu ada hubungannya dengan masalah yang saya temui.

versi git adalah 1.7.5.4

sunting: Tampaknya masalah yang paling mungkin adalah proses lain yang telah saya jalankan, yaitu menulis (tanpa sepengetahuan saya) ke direktori proyek. Saya me-restart mesin saya dan kemudian saya tidak punya masalah melakukan.


3
Ini bisa menjadi masalah izin di mana Git mengasumsikan karena tidak dapat membuat file yang sudah ada. Sudahkah Anda mencoba mengambil kepemilikan direktori atau menjalankan perintah Anda menggunakan sudo?

1
Saya pikir penjelasan Anda tentang aplikasi lain yang mengakses repo git sudah benar. Punya masalah yang sama saat rebase. Gitx sedang berlari. Setelah saya berhenti, git bekerja dengan baik.
The Who

2
@asahi: Apakah Anda mungkin ingin menerima jawaban? Ini akan membantu pembaca di masa depan.
MERose


3
@asahi: Anda dapat memposting konten hasil edit Anda (yang merupakan solusinya) sebagai jawaban dan kemudian menerimanya. (Meskipun solusi yang lebih umum daripada 'restart mesin' adalah proses lain mengakses direktori; memulai kembali hanya memotong simpul Gordian untuk mencoba mencari tahu yang mana dan mengapa.:) Dalam kasus saya, itu adalah IDE saya.) Bagaimanapun, orang sering menjawab pertanyaan mereka sendiri ketika mereka menemukan solusi mereka sendiri, yang Anda lakukan.
Wilson F

Jawaban:


328

Ini mungkin jawaban lama tapi saya berharap ini lebih berguna untuk selanjutnya yang membutuhkan solusi ini.

Di linux / unix / gitbash / cygwin, coba

rm -f .git/index.lock

Di Windows Command Prompt, coba:

del .git\index.lock


1
Saya melihat bahwa terkadang file kunci dihapus secara otomatis. Adakah petunjuk mengapa file ini kadang-kadang perlu dihapus secara manual?
Nrj

Saya tidak punya index.lock, apa yang harus saya lakukan? :(
Alex C

56
Mengingat bahwa masalah dalam pertanyaan adalah bahwa ia tidak dapat menghapus file, mengapa menurut Anda mencoba menghapus file tersebut seharusnya menjadi solusinya?
meroket

4
Bagi saya menutup dan membuka SourceTree menyelesaikan masalah ... Untuk sementara saya kira.
Andrew

1
@skyking dalam pertanyaan asli ada kesalahan yang mengatakan fatal: Unable to create 'project_path/.git/index.lock': File exists., ia mengatakan "File ada", dan menghapusnya akan menjadi solusi sederhana. Mengapa saya menyarankan menghapus file jika tidak ada dalam pertanyaan asli?
Ryan S

40

Untuk Windows:

  • Dari konsol PowerShell dibuka sebagai admin, coba
> rm -Force ./.git/index.lock
  • Jika itu tidak berhasil, Anda harus mematikan semua proses 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
Parameter tidak dapat diproses karena nama parameter 'f' ambigu.
3pitt

terima kasih, @MikePalmice, saya memperbarui ke-Force. Tampaknya mereka mengubah API
Andrei Epure

20

Pada platform Windows yang menjalankan Visual Studio 2015 RC (v4.6.00057) dalam kombinasi dengan SourceTree (v1.6.14.0) akan memberikan kesalahan ini juga.

Solusi: Dengan asumsi Anda ingin menggunakan pohon kode sebagai pengelola kode sumber, cukup nonaktifkan penyedia kontrol sumber di dalam Visual Studio seperti ini:

  1. Pergi ke: Alat> Opsi> Kontrol Sumber
  2. Pilih plug-in kontrol sumber saat ini sebagai: Tidak ada

Meskipun VS saya bahkan tidak seharusnya mengakses repositori-repositori itu, bagaimanapun juga ini adalah masalah ketika rebasing dengan SourceTree.
Kajetan Abt

Terima kasih, masalahnya masih ada dengan Pembaruan 3.
Elger Mensonides

Closing Visual Studio juga berfungsi (menghapus file index.lock.)
misterbee

10
  1. periksa apakah git masih berjalan (ps -ef | grep git)
  2. jika tidak, hapus file yang terkunci
  3. jika ya, bunuh proses git pada awalnya.

9

mencoba

rm -f ./.git/index.lock

jika Anda tidak memiliki proses git lain yang berjalan, maka cukup hapus file index.lock dari masing-masing proyek.


Bekerja di lingkungan mac saya.
Adam Hurwitz

6

Baru saja mengalami masalah ini ... Gitbox salah. Jadi mungkin Anda menjalankan GUI yang menyebabkan masalah.


Itu bukan GUI tetapi saya memiliki proses terpisah yang menulis ke direktori proyek. Saya tidak bisa mengetahuinya dan itu membuat saya gila.
asahi

Sepertinya GitX suka menyebabkan masalah ini juga.
Glutexo

6 tahun kemudian, itu Atom bagi saya
Susu

6

Ini terjadi ketika Anda membatalkan penarikan dari asal di tengah.

jadi yang dapat Anda lakukan adalah menghapus file index.lock secara manual dari direktori .git Anda.

rm -f ./.git/index.lock

cd ke direktori proyek Anda dan jalankan perintah ini.


8
Mengingat bahwa masalah dalam pertanyaan adalah bahwa ia tidak dapat menghapus file, mengapa menurut Anda mencoba menghapus file tersebut seharusnya menjadi solusinya?
menjulang tinggi

+1 @skyking. Menghapus file sudah jelas, masalahnya adalah tidak ada file untuk dihapus dan masalah berlanjut.
Catsunami

6
  1. Tutup setiap jendela yang berpotensi memengaruhi file .git / index.lock ini
  2. Hapus file .git / index.lock.
  3. Buka editor baris perintah Anda dan cd ke lokasi file git Anda.

(Jika file dibuat, cukup dari cd ke lokasi itu, maka masalahnya adalah editor Anda. Tutup editor Anda. Jangan gunakan editor ini lagi untuk tugas ini. Buka editor yang berbeda - catu daya windows atau cukup cmd. Sekarang Anda dapat menggunakan perintah git untuk melanjutkan)


5

Mungkin (telah terjadi pada saya), perintah ls mengatakan itu tidak ada karena pengguna saat ini tidak memiliki izin untuk mencapai direktori atau file itu.

Hapus kunci dan pastikan Anda mengeksekusi git dengan pengguna yang tepat untuk menghindari masalah izin.

Jika Anda berada di kotak GNU / Linux dengan perintah sudo :

sudo rm project_path / .git / index.lock


Di Windows, Anda dapat memeriksa untuk melihat apakah folder hanya-baca dengan klik kanan-> Properti-> Atribut.
Matt

Mengingat bahwa masalah dalam pertanyaan adalah bahwa file itu tidak ada, mengapa Anda pikir mencoba menghapus file harus menjadi solusinya?
meroket

@skyking Masalah izin menunjukkan kesalahan yang sama. Memang, saya sampai pada pertanyaan ini karena judulnya. Saya menulis jawaban saya sebagai salah satu solusi yang mungkin dan beberapa suara mengkonfirmasi bahwa itu terjadi pada orang lain juga;)
caligari

@ caligari Tidak juga. Masalah izin memberi jawaban lain untuk ls project_path/.git/index.lock.
Menjulang

5

del .git\index.lock bekerja untukku.

Saya menghadapi masalah ini saat checkout cabang baru dari cabang utama.

Checkout mudah terjadi setelah menghapus index.lockfile.


4

Terkadang Git membuat file kunci yang terkait dengan repo Anda saat Anda membuat perubahan atau kemungkinan besar saat Anda menggunakan sub modul. Pesan kesalahan akan menunjukkan kepada Anda jalur file kunci. Perbaiki: Cukup buka jalur di terminal secara manual dan hapus file kunci dengan $ rm index.lock

Itu akan membantu.


4

Saya punya masalah dengan SourceTree ketika berpindah cabang dengan mengklik dua kali di atasnya. Masalahnya tidak terlalu umum dan Atlassian tahu tentang itu tetapi mereka memutuskan untuk tidak memperbaikinya.

Untungnya ada solusinya. Alih-alih mengklik dua kali pada cabang yang ingin Anda alihkan, cukup klik kanan dan pilih "Checkout [nama cabang]". Itu harus berhasil sekarang.


terima kasih, klik kanan> checkout berfungsi sebagai alternatif. pesan kesalahannya cukup menyesatkan terutama ketika index.lock tidak ada.
Ernest

4

Saya telah menemukan skenario yang sama. Saya bahkan belum melakukan perubahan pada kode lokal saya. Saya baru saja mengedit file dan mengembalikannya. Saya hanya menghapus file di bawah ini di folder .git tersembunyi. Berhasil!

project_path / .git / index.lock


3

Kecuali Anda benar-benar bermaksud untuk root untuk memiliki repo Anda, ini terdengar seperti Anda secara tidak sengaja menjalankan perintah Git sebagai root (mungkin bahkan klon / init awal). Jika Anda bermaksud melakukan itu, maka Anda harus hidup dengan menjalankan semua perintah Git di repo sebagai root. Jika tidak, jalankan sudo chown your-user[:your-group] -R .gituntuk mengambil kepemilikan itu, dan kemudian melihat apakah semuanya bekerja.


Dalam kasus saya, saya telah mengacaukan mode file dan direktori di dalam .gitdan saya memperbaikinya dengan: find .git -type f -exec chmod 644 {} \;dan juga find .git -type d -exec chmod 755 {} \;saya telah mengacaukan mode ketika memindahkan proyek git saya dari satu komputer ke komputer lain
user3405291

Dalam kasus saya, saya menambahkan izin menulis ke file .gitsudo chmod g+w .git -R
Beatriz Fonseca

2

Banyak klien git yang bekerja pada repositori lokal yang sama bersaing untuk kunci itu. Setiap klien harus menunggu sampai kunci dilepaskan oleh pihak lain untuk menjadi warga negara yang baik. Bagi kami, SourceTree atau MSVS tampaknya melakukan beberapa pemeliharaan di latar belakang saat kami menjalankan skrip komit besar.

Mungkin 'git' sendiri harus mendukung argumen '--retriesWhenLocked 5' untuk mendukung percobaan ulang.atau bahkan default untuk ini ketika dijalankan secara manual.

Berikut ini adalah pembungkus PowerShell di sekitar git bernama "gitr" yang mencoba lagi sampai index.lock menghilang, menggunakan percobaan 5 standar, masing-masing 3 detik. Itu tidak pernah menghapus index.lock, dengan asumsi pengguna harus turun tangan. Itu diekstraksi dari skrip komit yang lebih besar. Ini hanya memiliki pengujian minimal dengan argumen sederhana.

  • Salin skrip ke C: \ bin dan tambahkan C: \ bin ke $ PATH.
  • Dari PS1> gitr --help
  • Dari 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

Saya juga punya pertanyaan ini di windows 10.

ketika saya mencoba del ./.git/index.lock, itu memberitahu sayacannot remove 'index.lock': Device or resource busy

Saya akhirnya mendapatkan alasannya:

komputer memiliki dua proses untuk menggunakan git:

  • git bash
  • cmder

jadi saya menggunakan cmder.exe untuk git commititu akan terjadi kesalahan.

jadi solusinya gunakan git bashatau Hentikan git bashkemudian gunakan cmder.exe


1

Saya memiliki kesalahan yang sama persis, tetapi masalahnya bukan file kunci. Sebaliknya masalahnya adalah bahwa saya telah menyalin isi dari repo git lain ke repo ini, termasuk folder .git tidak terlihat. Jadi, SourceTree bingung tentang repo yang ingin saya tampilkan file (ada ketidakcocokan antara repo SourceTree pikir saya berada di, dan yang repo isi .git dir tertanam saya mengatakan saya harus berada di).


1

Saya punya masalah dengan TortoiseGit dengan Cygwin di Windows. Saya tidak dapat menghapus hapus ./.git/index.lock bahkan dengan hak administratif, saya mencoba Cygwin dan command prompt, katanya file itu digunakan oleh proses lain.

Saya menemukan bahwa saya memiliki 2 contoh menjalankan TortoiseProc.exe. Saya membunuh salah satu dari mereka, dan menutup semua windows explorer windows saya, dan kemudian dapat menghapus file tersebut. Saya tidak tahu apakah membunuh sebuah instance dari TortoiseProc.exe adalah solusi atau menutup windows explorer windows.


1

Solusi bagi saya adalah menghapus file .index dan mengizinkan Git untuk membangun kembali file lain.


1

Saya tidak memiliki file inex.lock untuk dihapus, tetapi apa yang berhasil bagi saya adalah menghapus centang Read-Only dari jendela Attributes pada dialog Properties folder.




1

Dalam aplikasi sourceTree saya, saya tidak dapat melakukan komit atau beralih ke komit / brach lainnya. Waktu itu menunjukkan kesalahan seperti

fatal: Tidak dapat membuat bla bla bla ..

Saya cukup menyelesaikan ini dengan folder goto .git (di project Explorer Dir). Dan hapus Indeks ----- [jenis file: file LOCK]. Sekarang saya mendapatkan kembali semua akses di sourceTree ..

pastikan file kunci indeks. misalkan Anda tidak mendapatkan tipe file, ubah pengaturan tampilan file di komputer. Catatan: folder .git biasanya merupakan tipe folder yang tersembunyi.


1

Apa yang dilakukan untuk saya adalah:

git rebase --abort dan mulai kembali rebase.

Seperti yang disebutkan Andrew, saya juga menggunakan PHPStorm saat ini terjadi. Tidak harus menutupnya.


1

Pertama, Anda harus menavigasi ke folder spesifik proyek Anda .. Seperti jika nama proyek Anda adalah Firstproject maka pertama pergi ke direktori proyek .. kemudian ketik cd .git kemudian setelah menavigasi ke folder git ketik del index.lock After penghapusan file index.lock..Anda akan dapat melakukan dan mendorong seperti sebelumnya


1

Dalam kasus saya, itu windows, tidak ditutup sepenuhnya.

Windows hibernasi, ditolak untuk dipasang

Kemungkinannya adalah Windows benar-benar di-hibernasi. Windows melakukan ini secara otomatis ketika Anda memintanya untuk mematikan secara normal. Manfaatnya adalah Anda mendapatkan waktu start-up yang lebih cepat.

Untuk mematikan Windows tanpa melakukan hybernasi, lakukan hal berikut pada command-prompt (di Windows):

shutdown /s

Anda mungkin juga ingin menyertakan /t 0 untuk mematikan segera.

Saya menemukan tutorial yang bagus untuk menyiapkan peluncur untuk ini: Cara Melakukan Shutdown Penuh di Windows 8 Tanpa Menonaktifkan Boot Hybrid.

Pendekatan yang lebih sederhana untuk benar-benar mematikan Windows adalah dengan 'restart' (bukan 'shutdown'), tetapi kemudian mencegat proses boot dan boot Linux bukannya membiarkannya boot Windows.

kredit : mulia


1

Ini juga dapat terjadi jika Anda menggunakan klien baris perintah git alternatif, seperti hub .

Saya telah menggunakan hub sebagai pengganti alias untuk git selama beberapa tahun, tetapi baru-baru ini menulis skrip bash yang melakukan banyak git bekerja di dalamnya, dan mulai mendapatkan masalah kunci indeks ini.

Saya tidak dapat menemukan perbaikannya sampai saya ingat saya menjalankan hub bukan git. Saya menghapus itu dan masalahnya hilang!


0

Mendapatkan kesalahan:

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.

Tapi saya tidak bisa menemukan (juga menghapus) file .git / index.lock itu.

Dalam kasus saya, git-cola sedang berlari!

Itu jelas menciptakan .git / index.lock setiap sesekali, atau disebabkan oleh rebase yang saya lakukan pada baris perintah dan selama itu saya menerima kesalahan itu - jadi git-cola jelas-jelas "mengganggu" perintah baris menjalankan Git (atau beberapa operasi Git CLI).

Ini diselesaikan dengan menutup git-cola selama perintah baris git rebase.


0

Terkadang klien Git lain dapat mengganggu ketika ada banyak yang diinstal.

Yaitu. pastikan dengan Task Manager atau Get-Processyang TGitCachedari TortoiseGit tidak aktif di latar belakang.


0

Saya memiliki masalah yang sama baru-baru ini. Jika Anda akan memeriksa seluruh pesan kesalahan itu juga mengatakan bahwa ada beberapa proses yang menggunakan proses git yang menghalangi Anda untuk menghapus index.lock. Anda mungkin memiliki IDE yang terbuka seperti Visual Studio atau perangkat lunak terkait yang terintegrasi dengan git. Tutup dan coba menyimpan kembali file Anda. Semoga ini bisa membantu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.