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.)

adardesign
sumber
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'

adardesign
sumber
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-
adswebwork
sumber
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>
Ankit Vishwakarma
sumber
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.

hobbs
sumber
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-
Will Cain
sumber
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
C0DEF52
sumber
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.

sagunms
sumber
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.

Shivang Gupta
sumber
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.

Tyagi Akhilesh
sumber
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
Steve Chambers
sumber
-1

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

tidak menganggap tidak berubah dengan gerhana

Antonio
sumber
1
mengapa downvotes tolong?
Antonio