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?

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

Jawaban:

202

Aha! Saya hanya ingin:

git update-index --no-skip-worktree <file>
Kevin Burke
sumber
8
Saya suka Aha!
Ruto Collins
1
siapa yang
mau melemparkannya
1
Aha! = Eurika! : D
Daut
Saya bisa mengada-ada!
Tom Padilla
Mengapa jawaban terbaik di bagian bawah halaman
Carl Kroeger Ihl
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!

Stefan Anca
sumber
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
C0DEF52
sumber
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)
eXavier
sumber
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
pengguna276648
sumber
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'
yossico
sumber
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.

Bojidar Stanchev
sumber