Abaikan file yang dimodifikasi (tetapi tidak dilakukan) di git?

182

Dapatkah saya memberitahu git untuk mengabaikan file yang dimodifikasi (dihapus) tetapi tidak boleh dilakukan?

Situasinya adalah saya memiliki subdirektori dalam repo yang berisi hal-hal yang saya tidak tertarik sama sekali, jadi saya menghapusnya untuk mencegahnya muncul dalam pelengkapan otomatis dan sejenisnya (dalam IDE).

Tetapi sekarang, jika saya menambahkan folder itu ke .gitignore, tidak ada yang berubah, semua hal ditampilkan sebagai dihapus oleh status git.

Apakah ada cara untuk membuat git mengabaikannya?

(Atau, karena saya menggunakan git-svn, dapatkah saya melakukan perubahan pada git lokal dan memastikannya tidak diteruskan ke repo svn?)

Sam
sumber
alih-alih hanya menandai mereka sebagai tidak dimodifikasi dalam indeks repo, Anda mungkin ingin menghapusnya dari indeks sepenuhnya. Jadi sementara Anda masih memiliki file di direktori kerja Anda, indeks repo dapat dihapus seluruhnya, dan git bahkan tidak akan melihatnya sebagai sudah ada sama sekali. Silakan lihat tautan dalam jawaban saya di bawah ini.
MaurerPower

Jawaban:

274

lihat halaman manual git-update-index dan bit --assume-tidak berubah dan terkait.

ketika saya memiliki masalah Anda, saya melakukan ini

git update-index --assume-unchanged dir-im-removing/

atau file tertentu

git update-index --assume-unchanged config/database.yml
csmosx
sumber
3
Bisakah Anda membuat daftar semua file yang Anda abaikan?
Zitrax
21
Anda bisa mendapatkan file kembali dengangit update-index --no-assume-unchanged config/database.yml
Denis Kniazhev
1
Lihat jawaban Dave L di bawah ini untuk solusi yang lebih baru tanpa kekurangan --assume-unchanged.
Ben Challenor
2
Apakah mungkin menambahkan ini ke file konfigurasi repositori, daripada menjalankan perintah ini secara manual setiap waktu?
Tim Boland
1
Apakah akan ditampilkan sebagai dimodifikasi untuk komit berikutnya? Saya tidak ingin itu dianggap tidak berubah selamanya.
Pranav Nandan
41

Opsi yang lebih baru dan lebih baik adalah git update-index --skip-worktreeyang tidak akan hilang pada hard reset atau perubahan baru dari tarikan.

Lihat halaman manual di http://schacon.github.com/git/git-update-index.html

Dan perbandingannya di http://fallengamer.livejournal.com/93321.html

Dave L.
sumber
9
Satu kerugian yang perlu diperhatikan adalah bahwa begitu modifikasi file disembunyikan skip-worktree, menemukan file-file ini agak rumit. Satu-satunya cara saya tahu adalah git ls-files -v |grep -v '^H'. Juga, banyak alat GUI tidak tahu tentang fitur ini, dan dapat menghasilkan kesalahan lucu jika misalnya checkoutgagal karena file modifikasi "tersembunyi".
sleske
Saya tidak pernah dapat memahami APAPUN dari file git doc. Jadi ini tidak banyak membantu. (Setiap file doc mengasumsikan bahwa Anda memahami seluk-beluk setiap file doc lainnya!)
Scott Biggs
7

Gunakan kode ini

git update-index --assume-unchanged file-name
Sujiraj R
sumber
1
Sangat menarik. Saya harus menggunakan passord dalam proyek pakar saya tetapi saya tidak ingin mempublikasikannya di repositori git, jadi saya menempatkan placeholder untuk itu tanpa nilai lokal, properti, saya komit, lalu saya masukkan kata sandi, tetapi tandai file tidak berubah dengan perintah yang Anda sarankan. Jadi kata sandi tidak dipublikasikan.
Stefano Scarpanti
6

File yang dilacak tidak dapat diabaikan, jadi Anda harus menghapusnya dari indeks Anda terlebih dahulu. Tambahkan .gitignoreyang mengabaikan direktori yang tidak Anda inginkan, lalu hapus direktori-direktori itu, dan hapus semua orang yang tercerai berai git rm --cached.

John Feminella
sumber
1
Hm, saya coba ini, tetapi kemudian saya memiliki semua file terdaftar sebagai dihapus. Haruskah saya melakukan itu dan --cached akan menyebabkan itu tidak akan didorong ke remote? Atau apakah saya mendapatkan sth. salah? Yang paling penting bagi saya adalah tidak merusak repo (svn) jarak jauh.
1
Anda tidak dapat melakukan apa pun yang tidak dimulai dalam indeks Anda. git rm --cached semua yang Anda tidak ingin komit, kemudian tambahkan file .gitignore secara lokal yang memiliki "*" di dalamnya. Sekarang, tidak peduli berapa banyak yang Anda tambahkan, Anda tidak akan pernah melihat file-file itu lagi di indeks Anda.
John Feminella
Ah, saya pikir saya mengerti --cached sekarang .. Ini hanya menghilangkan hal-hal dari indeks, dan meninggalkan pohon yang bekerja sendiri .. Saya tidak yakin apakah saya kehilangan sesuatu, tapi AFAIS Saya mencari yang sebaliknya , menghapusnya dari pohon kerja tanpa menyentuh indeks .. Atau bisakah saya menggunakannya untuk itu?
6

Apa yang biasanya saya lakukan adalah

simpanan git

git apapun-lagi

berlaku simpanan git

git simpanan jelas

Walter
sumber
10
fwiw Anda juga dapat 'git stash pop' untuk melakukan dua yang terakhir sekaligus (meskipun 'git stash clear' akan menghapus SEMUA entri simpanan, jika Anda menginginkannya).
Groxx