Pertanyaan Bagaimana cara membuat Git “lupa” tentang file yang dilacak tetapi sekarang ada di .gitignore?


Ada file yang dilacak oleh git, tetapi sekarang file tersebut ada di .gitignore daftar.

Namun, file itu terus muncul git status setelah diedit. Bagaimana Anda memaksa git untuk benar-benar melupakannya?


3645
2017-08-13 19:23


asal


Jawaban:


.gitignore akan mencegah file yang tidak terlacak ditambahkan (tanpa add -f) ke set file yang dilacak oleh git, namun git akan terus melacak file apa pun yang sudah dilacak.

Untuk berhenti melacak file Anda harus menghapusnya dari indeks. Ini bisa dicapai dengan perintah ini.

git rm --cached <file>

Penghapusan file dari revisi kepala akan terjadi pada commit berikutnya.


3872
2017-08-13 20:40



Serangkaian perintah di bawah ini akan menghapus semua item dari Indeks Git (bukan dari direktori kerja atau repo lokal), dan kemudian memperbarui Indeks Git, sementara menghormati git mengabaikan. PS. Indeks = Cache

Pertama:

git rm -r --cached . 
git add .

Kemudian:

git commit -am "Remove ignored files"

1990
2017-09-30 13:51



git update-index melakukan pekerjaan untuk saya:

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

catatan: Solusi ini sebenarnya independen .gitignore karena gitignore hanya untuk file yang tidak terlacak.

edit: Karena jawaban ini dikirim, opsi baru telah dibuat dan yang seharusnya dipilih. Kamu harus menggunakan --skip-worktree yang untuk file yang dilacak dimodifikasi yang pengguna tidak ingin berkomitmen lagi dan simpan --assume-unchanged untuk kinerja untuk mencegah git memeriksa status file dilacak besar. Lihat https://stackoverflow.com/a/13631525/717372 untuk lebih jelasnya...


739
2017-11-27 11:24



git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

Ini mengambil daftar file yang diabaikan dan menghapusnya dari indeks, lalu melakukan perubahan.


217
2018-05-23 22:29



Saya selalu menggunakan perintah ini untuk menghapus file-file yang tidak terlacak. Satu-baris, Unix-style, hasil bersih:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

Ini daftar semua file yang Anda abaikan, ganti setiap baris output dengan baris yang dikutip sebagai gantinya untuk menangani jalur dengan spasi di dalamnya, dan teruskan semuanya git rm -r --cached untuk menghapus jalur / file / dirs dari indeks.


59
2018-06-19 15:42



Jika kamu tidak bisa git rm file yang dilacak karena orang lain mungkin memerlukannya (peringatan, bahkan jika kamu  git rm --cached, ketika orang lain mendapat perubahan ini, file mereka akan dihapus di sistem file mereka) silakan lihat https://gist.github.com/1423106 untuk cara orang-orang mengatasi masalah.


49
2017-07-19 00:08



pindahkan, komit, lalu pindahkan kembali. Ini berhasil bagi saya di masa lalu. Mungkin ada cara 'gittier' untuk mencapai hal ini.


43
2017-08-13 19:27



Apa yang tidak berhasil untuk saya

(Di Linux), saya ingin menggunakan posting di sini yang menyarankan ls-files --ignored --exclude-standard | xargs git rm -r --cached pendekatan. Namun, (beberapa) file yang akan dihapus memiliki baris baru tertanam / LF /\n dalam nama mereka. Tak satu pun dari solusi:

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

mengatasi situasi ini (dapatkan kesalahan tentang file tidak ditemukan).

Jadi saya menawarkan

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached

Ini menggunakan -z argumen untuk file-ls, dan -0 argumen untuk xargs untuk melayani dengan aman / benar untuk karakter "jahat" dalam namafile.

Di halaman manual git-ls-file (1), menyatakan:

Kapan opsi -z tidak digunakan, TAB, LF, dan karakter backslash di   nama path direpresentasikan sebagai \ t, \ n, dan \\, masing-masing.

jadi saya pikir solusi saya diperlukan jika nama file memiliki salah satu karakter ini di dalamnya.

EDIT: Saya telah diminta untuk menambahkan itu --- seperti apa pun git rm perintah --- ini harus diikuti oleh melakukan untuk menghapus permanen, mis. git commit -am "Remove ignored files".


37
2017-12-29 12:50



Saya mencapai ini dengan menggunakan git filter-cabang. Perintah yang saya gunakan diambil dari halaman manual:

PERINGATAN: ini akan menghapus file dari seluruh sejarah Anda

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

Perintah ini akan membuat ulang seluruh sejarah commit, mengeksekusi git rm sebelum setiap komit dan sebagainya akan menyingkirkan file yang ditentukan. Jangan lupa untuk memundurkannya sebelum menjalankan perintah seperti itu akan tersesat.


34
2017-08-13 19:35



Gunakan ini ketika:

1. Anda ingin melepaskan banyak file, atau

2. Anda memperbarui file gitignore Anda

Tautan sumber:  http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

Katakanlah Anda telah menambahkan / melakukan beberapa file ke repositori git Anda dan kemudian menambahkannya ke gitignore Anda; file-file ini akan tetap ada dalam indeks repositori Anda. Artikel ini akan kita lihat bagaimana menyingkirkannya.

Langkah 1: Komit semua perubahan Anda

Sebelum melanjutkan, pastikan semua perubahan Anda berkomitmen, termasuk file gitignore Anda.

Langkah 2: Hapus semuanya dari repositori

Untuk menghapus repo Anda, gunakan:

git rm -r --cached .
  • rm adalah perintah hapus
  • -r akan memungkinkan penghapusan rekursif
  • –cached hanya akan menghapus file dari indeks. File Anda akan tetap ada di sana.

Itu rm Perintah bisa tidak memaafkan. Jika Anda ingin mencoba apa yang dilakukan sebelumnya, tambahkan -n atau --dry-run bendera untuk menguji semuanya.

Langkah 3: Re menambahkan segalanya

git add .

Langkah 4: Berkomitmen

git commit -m ".gitignore fix"

Repositori Anda bersih :)

Dorong perubahan ke remote Anda untuk melihat perubahan yang efektif di sana juga.


21
2018-04-22 18:11