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.


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

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!


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/


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


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 $_ }

0

Ikuti langkah ini:

  1. Tambahkan path ke gitignorefile

  2. Jalankan perintah ini

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

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.