Batalkan git pembaruan-indeks --assume-tidak berubah <file>


463

Cara Anda Git mengabaikan menonton / melacak dir / file tertentu. Anda baru saja menjalankan ini:

git update-index --assume-unchanged <file>

Sekarang bagaimana Anda membatalkannya sehingga mereka ditonton lagi? (Sebut saja un-menganggap.)


5
Hanya sebuah catatan untuk mengatakan bahwa tampaknya melewatkan-worktree adalah kemungkinan apa yang Anda akan lebih baik untuk menggunakan daripada menganggap-tidak berubah, kecuali kinerja git adalah masalah Anda. stackoverflow.com/questions/13630849/…
GreenAsJade

Jawaban:


587

Untuk mendapatkan undo / tampilkan dir's / file yang diatur untuk menganggap-tidak berubah jalankan ini :

git update-index --no-assume-unchanged <file>

Untuk mendapatkan daftar dir / file yang assume-unchangeddijalankan ini :

git ls-files -v|grep '^h'


7
Perbaikan minor pada pernyataan grep Anda, bisa menggunakan '^ [az]' untuk menangkap semua file yang diabaikan, karena tag huruf pertama bisa berupa huruf selain 'H' / 'h'. Dari git-scm.com/docs/git-ls-files : Opsi ini mengidentifikasi status file dengan tag berikut (diikuti oleh spasi) di awal setiap baris: H :: cached S :: skip-worktree M: : unmerged R :: dihapus / dihapus C :: dimodifikasi / diubah K :: untuk dibunuh? :: lainnya
Bdoserror

8
Trik lain yang bermanfaat adalah git ls-files -v|grep '^h'|cut -c3-, yang akan memberi Anda hanya nama file, tanpa awalan "h".
Retsam

9
Jika Anda tidak tahu lagi file yang Anda assume-unchangedmiliki, gunakan saja git update-index --really-refresh. Dengan perintah itu, Anda tidak perlu mencari file dengan git ls-filesterlebih dahulu.
theDmi

103

Jika ini adalah perintah yang sering Anda gunakan - Anda mungkin ingin mempertimbangkan untuk memiliki alias juga. Tambahkan ke global Anda .gitconfig:

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

Cara mengatur alias (jika Anda belum tahu):

git config --configLocation alias.aliasName 'command --options'

Contoh:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

Setelah menyimpan ini untuk Anda .gitconfig, Anda dapat menjalankan perintah pembersih.

git hide myfile.ext

atau

git unhide myfile.ext

Ini dokumentasi git sangat membantu.

Sesuai komentar, ini juga alias bermanfaat untuk mencari tahu file apa yang saat ini disembunyikan:

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-

2
Alias ​​ini juga berguna:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

42

fungsi indeks pembaruan git memiliki beberapa opsi yang dapat Anda temukan mengetik seperti di bawah ini:

git update-index --help

Di sini Anda akan menemukan berbagai opsi - cara menangani dengan fungsi pembaruan-indeks.

[jika Anda tidak tahu nama file]

git update-index --really-refresh 

[jika Anda tahu nama file]

git update-index --no-assume-unchanged <file>

akan mengembalikan semua file yang telah ditambahkan dalam daftar abaikan.

git update-index --assume-unchanged <file>

git update-index - benar-benar-refresh, membatalkan semua menganggap-tidak berubah yang telah saya buat, terima kasih atas tipnya
Sérgio

git update-index --no-assume-unchanged <file>menyelamatkan hidup saya .. ok, saya hanya bisa menyinkronkan folder lagi, tapi saya memang menginginkan solusi "nyata" untuk masalah ini.
Cagatay Ulubay

38

Saya berasumsi (heh) maksudmu --assume-unchanged, karena saya tidak melihat --assume-changedopsi. Kebalikannya --assume-unchangedadalah --no-assume-unchanged.


32

Untuk mensintesis jawaban asli yang sangat baik dari @adardesign, @adswebwork dan @AnkitVishwakarma, dan komentar dari @Bdoserror, @Retsam, @seanf, dan @torek, dengan tautan dokumentasi tambahan dan alias ringkas ...

Perintah Dasar

Untuk mengatur ulang file yang dianggap-tidak berubah kembali menjadi normal:

git update-index --no-assume-unchanged <file>

Untuk membuat daftar semua file yang dianggap tidak berubah:

git ls-files -v | grep '^[a-z]' | cut -c3-

Untuk mengatur ulang semua file yang diasumsikan tidak berubah kembali menjadi normal:

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

Catatan: Perintah ini yang telah didaftar di tempat lain tampaknya tidak mengatur ulang semua file berasumsi tidak berubah lagi (saya percaya itu digunakan untuk dan sebelumnya terdaftar sebagai solusi):

git update-index --really-refresh

Pintasan

Untuk membuat tugas-tugas umum mudah untuk mengeksekusi di git, menambahkan / memperbarui berikut alias bagian untuk .gitconfiguntuk pengguna Anda (misalnya ~/.gitconfigpada nix * atau sistem MacOS):

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-

1
Sebab git hidden, Anda dapat mencapai efek yang sama tanpa alias shell atau skrip, menggunakan !seperti ini:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

1
--really-refreshtidak (atau tidak lagi melakukannya, mungkin memang pernah) menghapus flag asumsikan tidak berubah pada file indeks.
torek

Terima kasih, @torek! Saya mengkonfirmasi perilaku yang Anda jelaskan, dan saya memperbarui jawabannya dengan solusi berbeda untuk kasus "reset semua".
Will Cain

20

Jika Anda ingin membatalkan semua file yang diterapkan menganggap tidak berubah dengan status apa pun, tidak hanya di-cache (git menandai mereka berdasarkan karakter dalam huruf kecil), Anda dapat menggunakan perintah berikut:

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v akan mencetak semua file dengan statusnya
  2. grep '^[a-z]' akan memfilter file dan pilih hanya asumsikan tidak berubah
  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-assume-unchangedakan melewati semua jalur yang dipisahkan oleh karakter nol git update-index --no-assume-unchangeduntuk membatalkan

Ini sangat berguna. Terima kasih atas informasi terperinci!
Chamithra Thenuwara

11

Menambah @adardesignjawaban, jika Anda ingin mengatur ulang semua file yang telah ditambahkan ke assume-unchangeddaftar no-assume-unchangedsekaligus, Anda dapat melakukan hal berikut:

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

Ini hanya akan menghapus keluaran dua karakter dari grep yaitu "h ", kemudian melarikan diri dari ruang yang mungkin ada dalam nama file, dan akhirnya || trueakan mencegah perintah untuk mengakhiri sebelum waktunya jika beberapa file dalam loop memiliki kesalahan.


4

Jika Anda menggunakan Git Extensions , ikuti langkah-langkah di bawah ini:

  1. Pergi ke jendela komit.
  2. Klik pada dropdown bernama Perubahan direktori kerja .
  3. Pilih Tampilkan opsi file yang diasumsikan-tidak berubah .
  4. Klik kanan pada file yang ingin Anda hapus.
  5. Pilih Jangan anggap saya tidak berubah .

Kamu selesai.


0

Tidak ada di sini yang tidak tercakup. Tetapi ingin menambahkan 2 sen saya. Kadang-kadang, saya menjalankan build dan mengubah banyak file dan kemudian saya ingin mengerjakan sesuatu, jadi perintah ini sangat membantu saya.

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

Semoga orang lain juga merasakan manfaatnya.


Saya pikir Anda akan mendapat manfaat dari menggunakan .gitignoreuntuk mengabaikan artefak bangunan Anda.
Nick

1
Saya punya .gitignoretapi itu kadang-kadang, dalam pengalaman saya tidak cukup. Tapi saya mengerti konteks di mana Anda mengatakan ini.
Tyagi Akhilesh

0

Tidak ada solusi yang bekerja untuk saya di Windows - tampaknya menggunakan modal Hdaripada huntuk status file dan perintah grep memerlukan tanda sisipan tambahan ^juga mewakili awal baris serta meniadakan karakter berikutnya.

Solusi Windows

  1. Buka Git Bash dan ubah ke direktori tingkat atas yang relevan.
  2. git ls-files -v | grep '^^H' untuk membuat daftar semua file yang tidak di-cache
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree untuk membatalkan file yang dilewati semua file yang dilakukan melalui update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged untuk membatalkan file yang dilewati semua file yang dilakukan melalui update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' untuk kembali mendaftar semua file yang tidak di-cache dan memeriksa apakah perintah di atas telah berfungsi - ini seharusnya tidak mengembalikan apa pun

-1

Jika Anda menggunakan gerhana, Anda mungkin menemukan hal-hal berikut yang bermanfaat:

tidak menganggap tidak berubah dengan gerhana


1
mengapa downvotes tolong?
Antonio
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.