Batalkan git update-index --skip-worktree


148

Beberapa waktu lalu saya melakukan ini untuk mengabaikan perubahan pada file yang dilacak oleh git:

git update-index --skip-worktree <file>

Sekarang saya benar-benar ingin melakukan perubahan pada file ke sumber. Bagaimana cara membatalkan efek skip-worktree?


11
Saya juga tertarik bagaimana cara mendapatkan daftar file dalam status 'skip-worktree'?
troex

Jawaban:



35

Menurut http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html , gunakan

git ls-files -v

untuk melihat file "anggap tidak berubah" dan "lewati-worktree" yang ditandai dengan huruf khusus. File "skip-worktree" ditandai dengan S.

Sunting : Seperti yang disebutkan @amacleod , membuat alias untuk membuat daftar semua file tersembunyi adalah trik yang bagus untuk dimiliki sehingga Anda tidak perlu mengingatnya. Saya menggunakan alias hidden="git ls-files -v | grep '^S'"di .bash_profile saya. Ini sangat bagus!


9
Rapi. Saya dapat menggunakan git ls-files -v | grep '^S'untuk daftar file yang saya "sembunyikan" dengan skip-worktree. Berharap untuk membuat alias "tersembunyi" untuk perintah itu, tetapi menempatkan pengalihan pipa di alias sepertinya tidak berhasil.
amacleod

5
@amacleod gunakan a !. Seperti ini [alias] ignored = !git ls-files -v | grep "^S"Diuji, berfungsi.
Steven Lu

@amacleod Jangan kira Anda bisa menyarankan perintah alternatif untuk Windows?
Steve Chambers

1
@SteveChambers, Pendek menginstal grep, saya tidak tahu. Tergantung pada kulitmu, kurasa. Git Bash memang datang grep, saya pikir.
amacleod

1
Cemerlang, terima kasih @amacleod - tidak ada di jalan saya. Satu-satunya hal yang perlu saya ubah agar ini dapat bekerja di Windows adalah gaya kutipan - 'tidak berfungsi tetapi "tidak, yaitugit ls-files -v | grep "^S"
Steve Chambers

17

Jika Anda ingin membatalkan semua file yang diterapkan melewati worktree, Anda dapat menggunakan perintah berikut:

git ls-files -v | grep -i ^S | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree
  1. git ls-files -v akan mencetak semua file dengan statusnya
  2. grep -i ^S akan memfilter file dan hanya memilih lewati worktree (S) atau lewati worktree dan anggap tidak berubah, -i berarti abaikan case sensitive
  3. cut -c 3- akan menghapus status dan hanya menyisakan jalur, memotong dari karakter 3-rd hingga akhir
  4. tr '\012' '\000' akan mengganti karakter ujung baris (\ 012) menjadi nol karakter (\ 000)
  5. xargs -0 git update-index --no-skip-worktree akan melewati semua jalur yang dipisahkan oleh karakter nol ke git update-index --no-skip-worktree untuk membatalkan

1
Ini adalah jawaban terbaik
Dev

Jawaban ini adalah emas murni!
Yossico

7

Berdasarkan jawaban @ GuidC0DE, ini adalah versi untuk Powershell (saya menggunakan posh-git )

git update-index --no-skip-worktree $(git ls-files -v | sls -pattern "^S"| %{$_.Line.Substring(2)})

Dan untuk referensi juga perintah sebaliknya untuk menyembunyikan file:

git update-index --skip-worktree $(git ls-files --modified)

3

Bagi mereka yang menggunakan Tortoise Git:

  1. Klik kanan pada folder atau pada file tertentu, lalu pilih TortoiseGit > Check for modifications
  2. Hanya periksa Show ignore local changes flagged files . Anda akan melihat file yang Anda abaikan (atau semua file yang Anda abaikan, jika Anda mengklik kanan pada folder)
  3. Klik kanan pada file dan pilih Unflag as skip-worktree and assume-unchanged

3

Untuk kalian semua yang mencintai alias Bash, berikut adalah set saya untuk mengatur semuanya (berdasarkan C0DEF52)

alias gitskip='git update-index --skip-worktree ' #path to file(s)
alias gitlistskiped='git ls-files -v | grep ^S'
alias gitunskip='git update-index --no-skip-worktree ' #path to file(s)
alias gitunskipall='git ls-files -v | grep -i ^S | cut -c 3- | tr ''\\012'' ''\\000'' | xargs -0 git update-index --no-skip-worktree'

0

Jawaban ini ditujukan untuk orang yang kurang teknis menggunakan Windows.

Jika Anda tidak ingat / tahu file mana yang Anda klik "lewati-worktree" di kemudian gunakan:

git ls-files -v             //This will list all files, you are looking for the ones with an S at the beginning of the line. 

git ls-files -v | grep "S " //Use this to show only the lines of interest. Those are the files that have "skip-worktree".

Untuk memperbaiki masalah Anda:

Anda dapat membuka file -> klik kanan -> mengembalikan ke versi sebelumnya -> klik tab "git" di atas -> hapus centang pada kotak "lewati-worktree" -> klik "Terapkan" di bagian bawah.

Jika file terlalu banyak untuk diperbaiki dengan tangan maka Anda harus merujuk ke jawaban lainnya.

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.