Terapkan .gitignore pada repositori yang sudah ada yang melacak banyak file

314

Saya memiliki proyek Visual Studio yang ada di repositori saya. Saya baru-baru ini menambahkan file .gitignore di bawah proyek saya dan saya berasumsi bahwa memberitahu Git untuk mengabaikan file yang tercantum dalam file.

Masalah saya adalah bahwa semua file tersebut sudah dilacak dan sejauh yang saya tahu Git tidak akan mengabaikan file yang sudah dilacak sebelum aturan ditambahkan ke file ini untuk mengabaikannya.

Disarankan untuk menggunakan: git rm --cacheddan secara manual lepaskan mereka tetapi itu akan membawa saya selamanya untuk melewatinya satu per satu.

Saya berpikir untuk menghapus repositori dan membuatnya kembali tetapi kali ini dengan hadir file .gitignore, tetapi harus ada cara yang lebih baik untuk melakukan ini.

Tohid
sumber
1
Anda dapat git rm --cachedseluruh direktori dengan -ropsi, jika itu membantu
Nathan Wallace
Lihat juga: Lacak File Dari Git
Patrick James McDougle
1
kemungkinan duplikat dari Abaikan file yang telah dikomit ke repositori Git
fkoessler

Jawaban:

870

Jawaban ini memecahkan masalah saya:

Pertama-tama, komit semua perubahan yang tertunda.

Kemudian jalankan perintah ini:

git rm -r --cached .

Ini menghapus semuanya dari indeks, lalu jalankan:

git add .

Komit:

git commit -m ".gitignore is now working"
Tohid
sumber
9
Jawaban sempurna! Silakan tambahkan git push originjuga untuk mencerminkan perubahan dalam repositori jarak jauh.
Sanket Berde
8
Saya mulai menggunakan jawaban ini ... dan itu menghapus hampir semua yang ada di proyek saya! Jelas saya melakukan sesuatu yang salah. Tetapi saya ingin memperingatkan orang-orang untuk tidak mengikuti saran ini dengan santai.
Mark Olbert
4
Apakah ini pada akhirnya kehilangan riwayat file ketika Anda menghapus dan menambahkannya kembali
Aran Mulholland
10
Saya bertanya-tanya berapa banyak komit yang menggunakan .gitignore is now workingpesan ini . :)
ihavenoidea
1
Metode ini bekerja dengan baik untuk saya. Saya membuat file gitignore, mengabaikan seluruh direktori, lalu melakukan perubahan ini dengan membuat gitignore. Saya kemudian mengikuti ketiga perintah di atas persis seperti yang mereka katakan. Itu bekerja dengan sempurna, tetapi saya harus mengatakan bahwa Anda harus "melakukan semua perubahan yang tertunda" terlebih dahulu seperti yang dinyatakan di atas.
Erich Meissner
61
  1. Buat file .gitignore, jadi untuk melakukannya, Anda cukup membuat file .txt kosong.

  2. Maka Anda harus mengubah namanya dengan menulis baris berikut pada cmd (di mana git.txtnama file yang baru saja Anda buat):

    rename git.txt .gitignore

  3. Kemudian Anda dapat membuka file dan menulis semua file yang tidak terlacak yang ingin Anda abaikan untuk selamanya. Misalnya, milik saya terlihat seperti ini:

`` `

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Ada seluruh koleksi file .gitignore yang berguna oleh GitHub

  1. Setelah Anda memiliki ini, Anda perlu menambahkannya ke repositori git Anda seperti file lainnya, hanya saja file tersebut harus berada di root repositori.

  2. Kemudian di terminal Anda, Anda harus menulis baris berikut:

    git config --global core.excludesfile ~ / .gitignore_global

Dari dokumen resmi:

Anda juga dapat membuat file .gitignore global, yang merupakan daftar aturan untuk mengabaikan file di setiap repositori Git di komputer Anda. Misalnya, Anda dapat membuat file di ~ / .gitignore_global dan menambahkan beberapa aturan padanya.

Buka Terminal. Jalankan perintah berikut di terminal Anda: git config --global core.excludesfile ~ / .gitignore_global

Jika respositori sudah ada maka Anda harus menjalankan perintah ini:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

Jika langkah 2 tidak berhasil maka Anda harus menulis rute lubang dari file yang ingin Anda tambahkan.

SeseorangAnonim
sumber
4
@Karen_Wiznia "git config ... _global" menciptakan gitingore global untuk semua repo Git di komputer. OP tidak mau melakukan itu.
ivan7707
Saya berharap saya bisa menyukai ini lebih dari sekali, saya terus kembali ke pertanyaan ini mencari pengingat ini.
Antony D'Andrea
1
Seharusnya "mv git.txt .gitignore" bukan "rename git.txt .gitignore".
Ahmad F
30

Seperti yang ditentukan di sini Anda dapat memperbarui indeks:

git update-index --assume-unchanged /path/to/file

Dengan melakukan ini, file tidak akan muncul di git statusatau git diff.

Untuk mulai melacak file lagi, Anda dapat menjalankan:

git update-index --no-assume-unchanged /path/to/file
Patrick James McDougle
sumber
5
Ini adalah jawaban yang lebih baik - ini hanya difokuskan pada file tunggal, file yang Anda tidak ingin dilacak oleh repositori. Jawaban yang ditandai tertinggi akan bekerja juga, tetapi tidak lebih dari sekadar mengabaikan file dari pelacakan oleh git.
Chris Mejka
1
Ini bagus. Tetapi bagaimana jika kita menarik? Apakah ada konflik gabungan?
pramod
@ramod, pertanyaan bagus. Saya tidak begitu yakin. Cobalah dalam repositori tes yang dilucuti?
Patrick James McDougle
15

Jika Anda menambahkan Anda .gitignoreterlambat, git akan terus melacak file yang sudah dikomit. Untuk memperbaikinya, Anda selalu dapat menghapus semua instance cache dari file yang tidak diinginkan.

Pertama, untuk memeriksa file apa yang sebenarnya Anda lacak, Anda dapat menjalankan:

git ls-tree --name-only --full-tree -r HEAD

Katakanlah Anda menemukan file yang tidak diinginkan dalam direktori seperti cache/itu, lebih aman untuk menargetkan direktori itu daripada semua file Anda.

Jadi alih-alih:

git rm -r --cached .

Lebih aman menargetkan file atau direktori yang tidak diinginkan:

git rm -r --cached cache/

Kemudian lanjutkan untuk menambahkan semua perubahan,

git add .

dan komit ...

git commit -m ".gitignore is now working"

Referensi: https://amyetheredge.com/code/13.html

Eli Nunez
sumber
Ini adalah jawaban terbaik dan bersih jika Anda ingin menghapus hanya beberapa file, bukan seluruh repositori. Saya berikan ibu jari saya.
Apuig
2

Berikut adalah salah satu cara untuk "membuka kembali" file apa pun yang jika tidak akan diabaikan di bawah pola pengecualian saat ini:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Ini meninggalkan file di direktori kerja Anda tetapi menghapusnya dari indeks.

Trik yang digunakan di sini adalah untuk menyediakan file indeks yang tidak ada untuk git ls-file sehingga ia berpikir tidak ada file yang dilacak. Kode shell di atas meminta semua file yang akan diabaikan jika indeksnya kosong dan kemudian menghapusnya dari indeks aktual dengan git rm.

Setelah file telah "tidak dilacak", gunakan status git untuk memverifikasi bahwa tidak ada yang penting dihapus (jika demikian sesuaikan pola kecualikan Anda dan gunakan git reset - path untuk mengembalikan entri indeks yang dihapus). Kemudian buat komit baru yang meninggalkan "mentah".

"Crud" masih akan ada di komit lama. Anda dapat menggunakan git filter-branch untuk menghasilkan versi clean dari commit lama jika Anda benar-benar membutuhkan histori bersih (nb menggunakan git filter-branch akan "menulis ulang sejarah", jadi itu tidak boleh dilakukan dengan ringan jika Anda memiliki kolaborator yang telah menarik salah satu dari komitmen historis Anda setelah "crud" pertama kali diperkenalkan).


sumber
Kedengarannya seperti solusi yang solid :) Saya kira ini untuk Linux shell kan? sayangnya saya adalah pengguna Win7. Bagaimana saya bisa melakukan ini di windows?
Tohid
0

Hapus file dari area pementasan

git reset HEAD .

Tambahkan semua perubahan

git add .

Komit:

git commit -m ".gitignore is now working"
Mahdi Ben Selimene
sumber
-1

Saya pikir ini adalah cara mudah untuk menambahkan file .gitignore ke repositori yang ada.

Prasyarat :

Anda memerlukan peramban untuk mengakses akun github Anda.

Langkah

  1. Buat file baru di proyek yang diperlukan (ada) dan beri nama .gitignore . Anda akan mendapatkan prompt sugestif untuk templat .gitignore segera setelah Anda memberi nama file tersebut sebagai .gitignore . Gunakan templat ini atau gunakan gitignore.io untuk menghasilkan konten file gitignore Anda .
  2. Komit perubahan.
  3. Sekarang klon repositori ini.

Selamat bersenang-senang!

Roshan Poudyal
sumber
-3

Gunakan git clean
Dapatkan bantuan untuk menjalankan ini

git clean -h

Jika Anda ingin melihat apa yang akan terjadi terlebih dahulu, pastikan untuk meneruskan sakelar -n untuk lari kering:

git clean -xn

Untuk menghapus sampah gitingnored

git clean -xdf

Hati-hati: Anda mungkin mengabaikan file konfigurasi lokal seperti database.yml yang juga akan dihapus. Gunakan dengan risiko Anda sendiri.

Kemudian

git add .
git commit -m ".gitignore is now working"
git push
Nedudi
sumber