Menerapkan .gitignore ke file yang dikomit

436

Saya telah melakukan banyak file yang sekarang ingin saya abaikan. Bagaimana saya bisa memberitahu git untuk mengabaikan file-file ini dari komitmen yang akan datang?

EDIT: Saya juga ingin menghapusnya dari repositori. Mereka adalah file yang dibuat setelah pernah membangun atau untuk dukungan tooling khusus pengguna.

pengguna880954
sumber
1
kemungkinan duplikat file .gitignore tidak mengabaikan
Wooble
8
@ Wooble Jawabannya mungkin serupa, tetapi pertanyaan ini persis menggambarkan masalah yang saya hadapi dan perlu diselesaikan.
rjmunro
1
Ini adalah jawaban yang langsung menjawab pertanyaan judul dengan sedikit perubahan pada repo git Anda: stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

Jawaban:

472
  1. Edit .gitignoreuntuk mencocokkan file yang ingin Anda abaikan
  2. git rm --cached /path/to/file

Lihat juga:

Matt Ball
sumber
12
Ada banyak file. Saya tidak ingin melakukan ini untuk setiap orang
user880954
1
Apakah file dalam direktori umum? Jika tidak, masalahnya berkurang menjadi pertanyaan penggunaan shell, bukan pertanyaan git.
Matt Ball
12
Harus ada mode 'Saya lupa menambahkan .gitignore saya sampai setelah komit awal saya'.
Luke Puplett
9
Jawabannya ada di bawah ini.
Lopsided
3
Ia meminta saya untuk menambahkan flag -r untuk dapat melakukannya.
Vishal Gulati
601

Setelah mengedit .gitignoreagar sesuai dengan file yang diabaikan, Anda dapat melakukan git ls-files -ci --exclude-standarduntuk melihat file yang termasuk dalam daftar pengecualian; Anda kemudian bisa melakukannya

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

untuk menghapusnya dari repositori (tanpa menghapusnya dari disk).

Sunting : Anda juga dapat menambahkan ini sebagai alias di file .gitconfig Anda sehingga Anda dapat menjalankannya kapan saja. Cukup tambahkan baris berikut di bawah bagian [alias] (modifikasi sesuai kebutuhan untuk Windows atau Mac):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

(Tanda -rmasuk xargsmencegah git rmberjalan pada hasil kosong dan mencetak pesan penggunaannya, tetapi hanya dapat didukung oleh GNU findutils. Versi lain darixargs mungkin atau mungkin tidak memiliki opsi yang serupa.)

Sekarang Anda cukup mengetik git apply-gitignorerepo Anda, dan itu akan bekerja untuk Anda!

Jonathan Callen
sumber
10
Saya pikir xargs untuk mac tidak memiliki -r ... atau milik saya buggy / tua, saya tidak tahu ... dan mengapa !sebelumnya git? yah ... milikku bekerja juga alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached". tks!
Felipe Sabino
18
Di Windowsfor /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Luke Puplett
Ini baru saja menghapus file .gitignore saya, bukan file yang ingin saya abaikan yang terdaftar dalam file .gitignore - apakah itu intinya?
Hippyjim
@Hippyjim jika file tersebut sudah berkomitmen (meskipun mereka terdaftar dalam Gitignore), dan Gitignore adalah tidak belum dilakukan, maka itu akan menjadi hasil yang diharapkan, jika tidak, aku tidak yakin apa yang sedang terjadi dalam kasus Anda.
Jonathan Callen
1
Untuk pengguna mac, -rdefault dan tidak diterima oleh versi BSD. Jadi hapus -r.
Weishi Zeng
136

untuk meninggalkan file di repo tetapi mengabaikan perubahan di masa depan:

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

dan untuk membatalkan ini:

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

untuk mengetahui file mana yang telah diatur dengan cara ini:

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

kredit untuk jawaban asli untuk http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/

ben.tiberius.avery
sumber
1
Chronial memiliki jawaban yang bagus untuk melakukan ini secara rekursif untuk direktori: stackoverflow.com/a/16346756/1101076
jordan314
Saya ingin melakukan konfigurasi IDE tetapi tidak melacak perubahan yang tidak perlu. Ini berfungsi, meskipun saya tidak yakin apakah itu akan bekerja untuk orang lain yang memeriksa repositori. Dapat dikombinasikan dengan git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchangedjika itu membantu.
dlamblin
7
Ini adalah satu - satunya jawaban yang tepat seperti yang diminta pertanyaan judul. SEMPURNA! Sebagian besar jawaban lain ini mengacaukan file dengan sia-sia.
kayleeFrye_onDeck
1
Ini adalah jawaban yang tepat untuk pertanyaan itu. Menggunakan perintah like git rm --cachedakan menghapus file dalam repositori, yang tidak memenuhi kebutuhan quizzer. Terima kasih. Saya sangat menghargai itu. Jawaban Anda banyak membantu saya.
ramwin
88

Pastikan repo Anda yang sebenarnya adalah versi terbaru

  1. Edit .gitignoresesuai keinginan
  2. git rm -r --cached .
  3. git add .

kemudian lakukan seperti biasa

Théo Attali
sumber
14
Ini harus menjadi jawaban yang diterima karena pertanyaan khusus mengatakan ada banyak file yang harus dihapus.
nbeuchat
3
Perhatikan bahwa langkah 2 ini bisa memakan waktu cukup lama jika Anda memiliki repositori besar.
brainbag
Ini hanya menyebabkan penghapusan semua file dari indeks! Ini menyelamatkan saya: git reset HEAD(Ingatlah untuk
menyembunyikan
2
Langkah 2 menghapus semuanya, tetapi langkah 3 harus membaca semuanya, kecuali yang gagal karena .gitignore.
ojchase
11

Pertanyaan lama, tetapi sebagian dari kita ada di git-posh(PowerShell). Ini solusi untuk itu:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }
Chris Pfohl
sumber
0

Ikuti langkah ini:

  1. Tambahkan path ke gitignorefile

  2. Jalankan perintah ini

    git rm -r --cached foldername
    
  3. komit perubahan seperti biasa.

Kalyan Chakravarthi V
sumber