Bagaimana mengabaikan file tertentu di Git

731

Saya punya repositori dengan file Hello.java,. Ketika saya mengkompilasinya, Hello.classfile tambahan dihasilkan.

Saya membuat entri untuk Hello.classdalam .gitignorefile. Namun, file tersebut tampaknya masih dilacak.

Bagaimana saya bisa membuat Git diabaikan Hello.class?

Kohan95
sumber
8
Apa maksudmu "itu tidak berhasil"? Apakah Anda mungkin sudah menambahkan Hello.class ke repositori Anda? gitignores tidak berpengaruh pada konten yang sudah dilacak. Lihat misalnya stackoverflow.com/questions/1139762/gitignore-file-not-ignoring
Cascabel

Jawaban:

810

Masalahnya adalah bahwa .gitignorehanya mengabaikan file yang tidak dilacak sebelumnya (oleh git add). Jalankan git reset name_of_fileuntuk unstage file dan simpan. Jika Anda ingin juga menghapus file yang diberikan dari repositori (setelah mendorong), gunakan git rm --cached name_of_file.

Ondrej Slinták
sumber
190
Perintah ini git rm --cached name_of_fileakan menghapus file dari repo git Anda. Bahkan jika Anda menambahkannya ke file .gitignore Anda. Itu tidak mengabaikan yang menghapus.
OrwellHindenberg
4
Yang tampaknya menjadi apa yang diinginkan OP dalam kasus ini.
Ondrej Slinták
40
Saya senang solusi Anda berhasil untuk @ Kohan95! Padahal pertanyaan ini harus diganti namanya berdasarkan jawaban yang dipilih. Komentar saya hanyalah peringatan bagi para devs yang mungkin tidak menyadari apa yang dilakukan perintah.
OrwellHindenberg
91
git reset name_of_filemenghapus pelacakan dan tidak menghapus file.
Cees Timmerman
7
Mencoba git rm --cached <name_of_file> Itu memang menghapus file dalam repo, tetapi karena itu ada dalam file .gitignore, salinan lokal tidak dihapus. Sebagai catatan lebih lanjut, untuk menambahkan direktori, Anda harus memasukkannya dengan garis miring '/'. Saya menghapus direktori konfigurasi Rubymine dalam proyek ruby ​​yang telah diperiksa seseorang, yaitu ".idea". Dalam file saya meletakkan ".idea /" dan kemudian "git rm --cached -r .idea" untuk menghapus direktori dan semua yang ada di bawahnya (karena git hanya versi file, bukan direktori.)
Doug Noel
222

Cara mengabaikan file baru

Secara global

Tambahkan path ke file Anda yang ingin Anda abaikan ke .gitignorefile Anda (dan komit). Entri file ini juga akan berlaku untuk orang lain yang memeriksa repositori.

Secara lokal

Tambahkan path ke file Anda yang ingin Anda abaikan ke .git/info/excludefile Anda . Entri file ini hanya akan berlaku untuk copy pekerjaan lokal Anda.

Cara mengabaikan file yang diubah (sementara)

Untuk mengabaikan file yang diubah agar terdaftar sebagai dimodifikasi, Anda dapat menggunakan perintah git berikut:

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

Untuk mengembalikan ketidaktahuan itu gunakan perintah berikut:

git update-index --no-assume-unchanged <file>
Xman Klasik
sumber
Sempurna untuk mencegah file yang menahan kunci api saat ini dari didorong ke github!
Jim In Texas
1
@Xman Mengapa Anda mengatakannya sementara? Saya melakukan langkah-langkah yang Anda sebutkan untuk localgit diabaikan, dan restart sistem saya, itu masih menunjukkan bekerja langsung bersih.
Vivek Vardhan
1
Terima kasih atas update-indextrik yang bermanfaat , benar-benar sempurna untuk menghindari pengubahan .gitignorefile, yang kemudian dilacak oleh Git!
Thomas P.
@ mcbjam Tidak ada perintah khusus untuk diabaikan git. Edit file .gitignore yang terletak di tempat yang sesuai dalam copy pekerjaan. Anda kemudian harus menambahkan .gitignore ini dan melakukannya. Setiap orang yang mengkloning repo akan mengabaikan file-file itu.
Xman Klasik
@Vivek Vardhan git pembaruan-indeks --assume-tidak berubah seperti topeng sementara pada indeks. Ini akan tetap berlaku sampai Anda mematikannya. Untuk membuat poin saya lebih jelas, indeks awalnya (yaitu, tepat setelah git read-tree) "berisi" semua file dari tree-ish yang baru saja dibaca. Karena itu membuat Git "tutup mata" untuk entri indeks tidak sama dengan menghapusnya.
Xman Klasik
150

Tambahkan baris berikut ke .gitignore:

/Hello.class

Ini akan mengecualikan Hello.class dari git. Jika Anda sudah melakukannya, jalankan perintah berikut:

git rm Hello.class

Jika Anda ingin mengecualikan semua file kelas dari git, tambahkan baris berikut ke .gitignore:

*.class
Armand
sumber
32
Menambahkan Hello.classke .gitignoreakan mengabaikan file apa pun yang dipanggil Hello.classdalam subdirektori apa pun. Jika Anda hanya ingin mengabaikan file Hello.classdi direktori yang sama dengan .gitignorefile tersebut, gunakan /Hello.classbaris saja.
ndim
Di mana Anda meletakkan .gitignorefile?
CodyBugstein
6
@Imray Anda dapat menempatkan .gitignoredi mana saja dalam proyek git - jika path dimulai /, itu akan relatif terhadap lokasi .gitignorefile; jika tidak maka akan merujuk secara rekursif ke file dalam direktori saat ini dan direktori turunannya.
Armand
109

1) Buat .gitignorefile. Untuk melakukan itu, Anda cukup membuat .txtfile dan mengubah ekstensi sebagai berikut:

Masukkan deskripsi gambar di sini

Maka Anda harus mengubah nama, menulis baris berikut di jendela cmd:

 rename git.txt .gitignore

Di mana git.txtnama file yang baru saja Anda buat.

Kemudian Anda bisa membuka file dan menulis semua file yang tidak ingin Anda tambahkan di repositori. 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
~$*

Setelah Anda memilikinya, Anda perlu menambahkannya ke repositori Git Anda. Anda harus menyimpan file di mana repositori Anda berada.

Kemudian di Git Bash Anda harus menulis baris berikut:

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

Jika repositori sudah ada maka Anda harus melakukan hal berikut:

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

Jika langkah 2 tidak berhasil, Anda harus menulis seluruh rute file yang ingin Anda tambahkan.

SeseorangAnonim
sumber
Anda dapat menggunakan perintah "copy con .gitignore" di prompt dan kemudian tekan CTRL + Z untuk langsung membuat file tanpa Windows Explorer.
heringer
61

Untuk mengabaikan:

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

Untuk membatalkan, abaikan:

git update-index --no-assume-unchanged <path/to/file>
rata-rata
sumber
6
Saya ingin ini menjadi puncak grafik sebagai solusi untuk masalah .... Sangat sederhana & elegan
user1457958
"Sangat sederhana & elegan" - tidak juga : 'Asumsikan tidak berubah tidak boleh disalahgunakan untuk mekanisme pengabaian. Itu adalah "Saya tahu operasi sistem file saya lambat. Saya berjanji kepada Git bahwa saya tidak akan mengubah jalur ini ..." Terutama, itu bukan janji ... bahwa Git akan selalu menganggap jalur ini tidak dimodifikasi — jika Git dapat menentukan jalur ... telah berubah tanpa menimbulkan lstat(2)biaya tambahan , ia berhak melaporkan bahwa jalur telah dimodifikasi (... git commit -abebas untuk melakukan perubahan itu). '
Chris
47

Anda dapat menggunakan metode di bawah ini untuk mengabaikan / tidak mengabaikan perubahan pada file yang dilacak.

  1. Untuk mengabaikan: git update-index --assume-unchanged <file>
  2. Untuk mengembalikan file yang diabaikan: git update-index --no-assume-unchanged <file>
kapillohakare
sumber
4
Apakah itu berlaku untuk semua file? Tidak jelas bagaimana perintah-perintah itu dapat diterapkan pada satu file saja untuk mengabaikan / membatalkannya.
javadba
@kapil akhirnya !! sesuatu yang benar-benar berfungsi di antara variasi perintah triliun git! Mencoba setiap jawaban untuk mengabaikan beberapa file build.xml bodoh yang terus muncul setelah setiap build ... terima kasih!
killjoy
1
Tolong jangan : 'Asumsikan-tidak berubah tidak boleh disalahgunakan untuk mekanisme pengabaian. Itu adalah "Saya tahu operasi sistem file saya lambat. Saya berjanji kepada Git bahwa saya tidak akan mengubah jalur ini ..." Terutama, itu bukan janji ... bahwa Git akan selalu menganggap jalur ini tidak dimodifikasi — jika Git dapat menentukan jalur ... telah berubah tanpa menimbulkan lstat(2)biaya tambahan , ia berhak melaporkan bahwa jalur telah dimodifikasi (... git commit -abebas untuk melakukan perubahan itu). '
Chris
22

Buat .gitignoredi dalam direktori di mana .git berada. Anda dapat membuat daftar file di dalamnya yang dipisahkan oleh baris baru. Anda juga dapat menggunakan wildcard:

*.o
.*.swp
ujung
sumber
3
Ini adalah praktik yang baik untuk menghindari menempatkan pola khusus alat (yaitu file Vim sementara Anda) dalam .gitignorefile (kecuali jika alat itu diamanatkan oleh proyek). Anda dapat meletakkan pola untuk alat favorit Anda di file per pengguna Anda tidak termasuk (set core.excludesFile); mereka akan bekerja di semua repositori Anda. Misalnya git config --global core.excludesFile "$HOME/.git-user-excludes", lalu taruh di file itu.
Chris Johnsen
@ Chris: Terima kasih atas tipnya. Tapi saya hanya menulis di sana karena tidak ada yang lebih baik datang ke pikiran saya :)
terminus
1
@ChrisJohnsen 'spesifik alat?' untuk vim ?? saya pikir aman untuk mengecualikan file swap vim ..
javadba
16

Dari situs GitHub resmi:

Jika Anda sudah memiliki file yang dicentang, dan Anda ingin mengabaikannya, Git tidak akan mengabaikan file jika Anda menambahkan aturan nanti. Dalam kasus tersebut, Anda harus membuka kembali file terlebih dahulu, dengan menjalankan perintah berikut di terminal Anda:

git rm --cached FILENAME

atau

git rm --cached .
Mile Mijatović
sumber
12

Anda harus menulis sesuatu seperti

*.class

ke dalam .gitignorefile Anda .

KingCrunch
sumber
4
@ AgentZebra Anda harus menambahkan entri *.classke Anda .gitignoreuntuk membuat git mengabaikan semua file yang berakhiran .class.
KingCrunch
7

Tambahkan file mana yang ingin Anda abaikan ke file .gitignore:

*.kelas

* .proyek

* .prefs

*.proyek

Chinmoy
sumber
5

Jika Anda telah melakukan file dan Anda mencoba untuk mengabaikannya dengan menambahkan .gitignorefile, Git tidak akan mengabaikannya. Untuk itu, pertama-tama Anda harus melakukan hal-hal di bawah ini:

git rm --cached FILENAME

Jika Anda memulai proyek baru dan Anda ingin menambahkan beberapa file ke Abaikan, ikuti langkah-langkah di bawah ini untuk membuat file Abaikan:

  1. Arahkan ke gudang Git Anda.
  2. Masukkan "sentuh .gitignore" yang akan membuat .gitignorefile.
Savyasachi
sumber
3

Anda juga dapat menggunakan .gitattributes (bukan .gitignore) untuk mengecualikan seluruh tipe file. File ini cukup jelas, tapi saya menempelkan isinya di sini untuk referensi. Perhatikan baris terakhir (* .class binary):

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.mo binary
*.pdf binary
*.phar binary
*.class binary
David Niki
sumber
2

Tambahkan baris berikut ke .git / info / kecualikan:
Hello.class

Dado
sumber
Apakah Anda seharusnya mengubah file di dalam folder .git?
Peter Mortensen
Mungkin, bukan ide yang baik untuk menyentuh file-file itu di bawah. Git secara manual.
mgyky
2

Halaman web ini mungkin berguna dan menghemat waktu saat bekerja dengannya .gitignore.

Secara otomatis menghasilkan file .gitignore untuk berbagai IDE dan sistem operasi dengan file / folder tertentu yang biasanya tidak ingin Anda tarik ke repositori Git Anda (misalnya, folder khusus IDE dan file konfigurasi).

Jaime Caffarel
sumber
1

Saya mencoba ini -

  1. daftar file yang ingin kita abaikan

git status .idea/xyz.xml .idea/pqr.iml Output .DS_Store

  1. Salin konten langkah # 1 dan tambahkan ke file .gitignore.

echo " .idea/xyz.xml .idea/pqr.iml Output .DS_Store" >> .gitignore

  1. Mengesahkan

git status .gitignore

kita juga dapat menambahkan direktori dan semua sub dir / file yang ingin kita abaikan dalam status git directoryname/*dan saya menjalankan perintah ini dari srcdirektori.

VIPIN KUMAR
sumber
1
  1. Buka file .gitignore dan tambahkan entri untuk file yang ingin Anda abaikan
  2. Lari git rm -r --cached .
  3. Sekarang jalankan git add .
Rahul Garg
sumber
0

Saya sudah mencoba --assume-unchangeddan juga.gitignore tetapi tidak berhasil. Mereka membuatnya sulit untuk beralih cabang dan sulit untuk menggabungkan perubahan dari yang lain. Ini solusi saya:

Ketika saya komit , saya secara manual menghapus file dari daftar perubahan

Sebelum saya tarik , saya menyimpan file yang diubah. Dan setelah menarik, saya melakukan pop simpanan .

  1. simpanan git
  2. git pull
  3. git stash pop

Langkah 3 terkadang akan memicu penggabungan dan dapat mengakibatkan konflik yang perlu Anda selesaikan, yang merupakan hal yang baik.

Ini memungkinkan saya untuk menyimpan perubahan lokal yang tidak dibagikan dengan orang lain di tim.

John Henckel
sumber