Bagaimana saya bisa menghentikan .gitignore agar tidak muncul dalam daftar file yang tidak dilacak?

971

Saya baru saja melakukan git initpada root proyek baru saya.

Lalu saya membuat .gitignorefile.

Sekarang, ketika saya mengetik git status, file .gitignore muncul di daftar file yang tidak dilacak . Mengapa demikian?

Jacques René Mesrine
sumber
13
git add self && git commit -m "-1 for reverting existential depression" && git remote rm HEAD
Alastair
1
Bisakah saya mengabaikan folder .git / dan meletakkannya di ".gitignore"?
Timo
2
Anda dapat membuat "gitignore" global di folder home Anda di Linux dan menyimpannya di sana: git config --global core.excludesfile ~ / .gitignore_global
Timo
14
Saya datang ke sini dengan mencari how to gitignore .gitinore filedan pertanyaan serta jawaban yang diterima tidak benar-benar terkait dengan judul. Judul bisa ditingkatkan.
m.rufca
6
Ada kasus penggunaan untuk mengabaikan .gitignore. Alur kerja tim saya mengharuskan saya untuk mengubah satu set file untuk lingkungan pengembang lokal saya tetapi tidak boleh dilakukan. Alur kerjanya dapat ditingkatkan dengan arsitektur yang lebih baik tetapi itu keluar dari tangan saya. Sementara itu, memiliki git memperhatikan file-file itu adalah suatu kewajiban. Jadi saya ingin gitignore mereka tetapi hanya secara lokal, dan saya tidak ingin mengambil risiko melakukan .gitignore saya karena tidak boleh dibagikan dengan tim.
Markus

Jawaban:

959

The .gitignorefile harus dalam repositori Anda, sehingga memang harus ditambahkan dan berkomitmen dalam, sebagaigit status menyarankan. Itu harus menjadi bagian dari pohon repositori, sehingga perubahan itu bisa digabungkan dan seterusnya.

Jadi, tambahkan ke repositori Anda, itu tidak boleh gitignored.

Jika Anda benar-benar mau, Anda dapat menambahkan .gitignoreke .gitignorefile jika Anda tidak ingin itu dilakukan. Namun, dalam hal ini mungkin lebih baik untuk menambahkan diabaikan .git/info/exclude, file checkout-lokal khusus yang berfungsi seperti .gitignore tetapi tidak muncul dalam "status git" karena ada di .gitfolder.

Lihat juga https://help.github.com/articles/ignoring-files

Lilleaas Agustus
sumber
17
Tidakkah ini harus menjadi bagian dari metadata repositori daripada file yang dilacak?
endolith
13
Metadata repositori bersifat lokal ke repositori. Jika Anda menambahkan hook komit ke repo Anda, dan seseorang mengkloning repo Anda, mereka tidak akan mendapatkan hook komit, misalnya.
Agustus Lilleaas
91
@wukong, jika Anda bekerja di tim, bukankah seharusnya semua orang mengabaikan set file yang sama? Itu sebabnya file .gitignore ditambahkan ke repositori. Tidak ada yang mengatakan Anda harus menggunakannya sebagai bagian dari proyek Anda.
Ryan Lundy
13
@endolith dan wukong Tidak harus menjadi file di repo Anda. Anda dapat memiliki pengaturan pengabaian di banyak tempat berbeda. GitHub memiliki artikel yang bagus tentang help.github.com/ignore-files Anda dapat memiliki pengaturan abaikan global di mana saja, dan Anda dapat memiliki pengaturan spesifik repo di metadata .git untuk repo.
Boushley
6
@ deed02392 Dalam menggunakan file-file abaikan ini Anda tentu perlu menggunakan penilaian dalam apa yang Anda masukkan ke dalamnya, tetapi mereka masih memiliki beberapa kegunaan besar. Misalnya saya menggunakan Vim dan di global gitignore saya memiliki file * .swp yang ditandai sebagai diabaikan. Dengan cara ini saya tidak perlu menambahkannya ke setiap proyek saya, dan orang-orang yang tidak pernah menggunakan vim tidak perlu khawatir tentang hal itu.
Boushley
282

Jika Anda ingin menyimpan daftar file yang diabaikan di luar pohon Git Anda, Anda dapat menggunakan file .git / info / exclude . Ini diterapkan hanya untuk checkout Anda dari repo.

Paweł Hajdan
sumber
19
+1, ini bagus untuk mengabaikan yang tidak terkait dengan proyek, seperti emacs * ~ file cadangan, .DS_Store dari OS X dan sebagainya.
Agustus Lilleaas
38
@AugustLilleaas Saya pribadi lebih suka memasukkan jenis {editor, platform} file-spesifik ini ~/.gitignoresehingga mereka diabaikan untuk repositori yang saya kerjakan.
Michael Mior
22
Setelah file dilacak, Anda dapat menggunakan git update-index --assume-unchanged <file>untuk menghentikan pelacakan perubahan tanpa mengubah repo Anda. Ini sangat berguna pada proyek bersama besar di mana Anda perlu melakukan perubahan lokal, tetapi tidak ada orang lain yang ingin melihat barang-barang Anda berkomitmen untuk repo. Lihat blog.pagebakers.nl
Chris Esplin
6
@AugustLilleaas: Per-pengguna gitignore lebih baik untuk kasus penggunaan itu.
Siput mekanik
3
terima kasih untuk tip ini, saya menggunakan git-svn sehingga pengguna repo svn lain di server tidak akan mau .gitignore
mendaftar
74

Anda benar-benar bisa memasukkan garis .gitignoreke dalam.gitignore file . Ini akan menyebabkan .gitignorefile diabaikan oleh git. Saya sebenarnya tidak berpikir ini adalah ide yang bagus. Saya pikir file abaikan harus dikendalikan dan dilacak versi. Saya hanya menempatkan ini di luar sana untuk kelengkapan.

INFORMASI 1800
sumber
7
Bekerja untukku! versi 1.5.6.5. Saya juga setuju dengan 1800 INFORMASI bahwa itu bukan ide yang baik, tapi saya pikir itu bisa baik-baik saja dalam konteks tertentu (misalnya Anda menggunakan repositori git-svn, dan Anda tidak ingin file git-ish pergi ke svn). File yang dikecualikan mungkin lebih baik.
J. Polfer
4
@ehsanul - file tidak boleh dilacak (Anda seharusnya tidak menambahkan atau melakukannya). Anda bisa melepaskannya. Ini mungkin bukan ide bagus di lingkungan yang hanya menggunakan git, tetapi jika Anda kebetulan menggunakan git sebagai klien pintar untuk repositori subversi (tanpa diketahui, <tawa gila>) - trik seperti itu bagus.
Tomasz Gandor
2
@IshanSrivastava Anda mungkin sudah melacak file-nya. Coba jalankangit rm --cached .gitignore
Gideon
51

Anda juga dapat memiliki .gitignorefile git pengguna global yang akan diterapkan secara otomatis ke semua repo Anda. Ini berguna untuk file IDE dan editor (mis. swpDan *~file untuk Vim). Ubah lokasi direktori yang sesuai dengan OS Anda.

  1. Tambahkan ke ~/.gitconfigfile Anda :

    [core]
    excludesfile = /home/username/.gitignore
    
  2. Buat ~/.gitignorefile dengan pola file untuk diabaikan.

  3. Simpan file dot Anda di repo lain sehingga Anda memiliki cadangan (opsional).

Setiap kali Anda menyalin, init atau mengkloning repo, file global gitignore Anda akan digunakan juga.

Alec si Geek
sumber
6
Saya percaya ini adalah solusi terbaik untuk situasi di mana editor Anda meninggalkan file temp, mis. *. Swp (VIM) dan ._ * (TM), karena tidak masuk akal untuk terus menambahkan aturan-aturan ini ke setiap git repo, dan untuk memaksa pengguna lain dengan IDE berbeda untuk memeriksa file-file ini.
Thomas Hunter II
1
Ini bekerja dengan baik untuk mengabaikan yang tidak harus didorong ke cabang mana pun. Ganti 'nama pengguna' dengan nama pengguna Anda yang sebenarnya, tentu saja, dan jangan tambahkan bagian [inti] kedua ke .gitconfig jika Anda sudah memilikinya - cukup tempatkan baris excludefile di bawah bagian [core] yang ada.
Amril
47

Jika seseorang telah menambahkan .gitignoreke repo Anda, tetapi Anda ingin membuat beberapa perubahan padanya dan membiarkan perubahan itu diabaikan lakukan hal berikut:

git update-index --assume-unchanged .gitignore

Sumber .

Leif Gruenwoldt
sumber
5
Gagasan buruk, ada alasan .git/info/excludesada.
Arrowmaster
6
Saya kira ada alasan --assume-unchangedada juga. Mengapa yang satu lebih baik dari yang lain?
Leif Gruenwoldt
9
Dan btw .git/info/excludestidak berfungsi jika file sudah dilacak.
Leif Gruenwoldt
Ini benar-benar membantu saya dengan .gitignore yang sudah dilakukan dan saya tidak ingin melakukan perubahan. Saya menjalankan git 1.7.4.1 dari repo Ubuntu 11.04 dan halaman bantuan menambahkan ini dalam indeks-pembaruan. "Opsi ini juga dapat digunakan sebagai mekanisme tingkat file kasar untuk mengabaikan perubahan yang tidak dikomit dalam file yang dilacak (mirip dengan apa yang dilakukan .gitignore untuk file yang tidak dilacak). misalnya ketika menggabungkan komit; dengan demikian, jika file diasumsikan tidak terlacak diubah hulu, Anda akan perlu menangani situasi secara manual. "
YonahW
Saya memilih jawaban ini karena umumnya Anda akan memerlukan tindakan ini untuk keadaan awal master repo dan menjaga manfaat fungsionalitas git. Tidak ada alasan yang baik untuk mengabaikan file ini (titik)
Lazaros Kosmidis
37

Setelah Anda menambahkan .gitignorefile dan mengkomitnya, itu tidak akan lagi muncul di daftar "file tidak terpantau".

git add .gitignore
git commit -m "add .gitignore file"
git status
Greg Hewgill
sumber
20

Hanya memetikan orang lain memiliki rasa sakit yang sama yang kita miliki. Kami ingin mengecualikan file yang sudah dilakukan.

Posting ini jauh lebih bermanfaat: bekerja dengan .git / info / kecualikan terlambat

Khususnya apa yang Anda perlukan untuk mengabaikan file sebenarnya menggunakan perintah git remove Lihat git rm ( http://www.kernel.org/pub/software/scm/git/docs/git-rm.html )

Anda mengujinya dengan pergi

git rm --dry-run *.log
(jika Anda mengatakan ingin mengecualikan semua file log)

ini akan menampilkan apa yang akan dikecualikan jika Anda menjalankannya.

kemudian

Anda menjalankannya dengan pergi

git rm *.log
(atau jalur nama file / ekspresi apa pun yang Anda inginkan)

Kemudian tambahkan *.logbaris ke .gitignorefile Anda .

Berkembang
sumber
4
Tentu saja, Anda mungkin ingin menindaklanjuti ini dengan menambahkan pola yang relevan (yaitu, * .log) ke .gitignore Anda, sehingga mereka tidak mengacaukan Anda git statusjika mereka muncul di masa depan.
Patrick O'Leary
2
Meskipun masalah saya tidak terkait dengan yang sama dengan OP: Terima kasih telah memberi tahu saya bahwa saya perlu menggunakan RM untuk "membersihkan" repo saya setelah saya melakukan perubahan ke .gitignore (jika file sudah siap.) Kesalahan noob Saya tahu, tetapi ini adalah tempat pertama yang secara pribadi saya lihat ada yang menyebutkannya.
Mike
Terima kasih untuk umpan baliknya. Ya itu sebabnya saya menulisnya, setelah datang ke sini dan kemudian pergi jauh untuk menyelesaikan ini juga, berpikir akan baik untuk menuliskannya. :)
Evolve
16

Tentu saja file .gitignore muncul di status, karena tidak terpantau, dan git melihatnya sebagai file baru yang enak untuk dimakan!

Karena .gitignore adalah file yang tidak bisa dilacak, itu adalah kandidat untuk diabaikan oleh git ketika Anda memasukkannya ke dalam .gitignore!

Jadi, jawabannya sederhana: cukup tambahkan baris:

.gitignore # Ignore the hand that feeds!

ke file .gitignore Anda!

Dan, bertentangan dengan respons August, saya harus mengatakan bahwa itu bukan file .gitignore yang seharusnya ada di repositori Anda. Kebetulan bisa , yang sering nyaman. Dan mungkin benar bahwa inilah alasan .gitignore dibuat sebagai alternatif .git / info / exclude, yang tidak memiliki opsi untuk dilacak oleh repositori. Bagaimanapun, bagaimana Anda menggunakan file .gitignore Anda sepenuhnya terserah Anda.

Untuk referensi, lihat manual gitignore (5) di kernel.org.

mengejar
sumber
15

Idenya adalah untuk meletakkan file yang khusus untuk proyek Anda ke dalam .gitignorefile dan (seperti yang telah disebutkan) menambahkannya ke repositori Sebagai contoh .pycdan.o file, log yang dibuat testuite, beberapa perlengkapan dll.

Untuk file yang dibuat oleh pengaturan Anda sendiri tetapi yang belum tentu muncul untuk setiap pengguna (seperti .swpfile jika Anda menggunakan vim, direktori ecplise tersembunyi dan sejenisnya), Anda harus menggunakan .git/info/exclude(sebagaimana telah disebutkan).

bayer
sumber
14

Pertama-tama, seperti yang sudah dikatakan banyak orang, Anda .gitignoreharus dilacak oleh Git (dan karenanya tidak boleh diabaikan). Biarkan saya jelaskan alasannya.

(TL; DR: komit .gitignorefile, dan gunakan global.gitignore untuk mengabaikan file yang dibuat oleh IDE atau sistem operasi Anda)

Git, seperti yang mungkin sudah Anda ketahui, sistem kontrol versi terdistribusi . Ini berarti memungkinkan Anda untuk beralih antara versi yang berbeda (bahkan jika pengembangan telah menyimpang ke cabang yang berbeda) dan juga memungkinkan beberapa pengembang untuk bekerja pada proyek yang sama.

Meskipun pelacakan Anda .gitignorejuga memiliki manfaat ketika Anda beralih di antara snapshot, alasan paling penting untuk melakukannya adalah Anda ingin berbagi file dengan pengembang lain yang bekerja pada proyek yang sama. Dengan mengkomit file ke Git, kontributor lain akan secara otomatis mendapatkan .gitignorefile ketika mereka mengkloning repositori, sehingga mereka tidak perlu khawatir tentang secara tidak sengaja melakukan file yang tidak boleh dilakukan (seperti file log, direktori cache, kredensial database , dll.). Dan jika suatu saat proyek .gitignorediperbarui, mereka dapat dengan mudah melakukan perubahan itu daripada harus mengedit file secara manual.

Tentu saja, akan ada beberapa file dan folder yang ingin Anda abaikan, tetapi itu khusus untuk Anda, dan tidak berlaku untuk pengembang lain. Namun, itu tidak boleh di proyek .gitignore. Ada dua tempat lain di mana Anda dapat mengabaikan file dan folder:

  • File dan folder yang dibuat oleh sistem operasi atau IDE Anda harus ditempatkan secara global.gitignore . Keuntungannya adalah ini .gitignorediterapkan ke semua repositori di komputer Anda, jadi Anda tidak perlu mengulang ini untuk setiap repositori. Dan itu tidak dibagikan dengan pengembang lain, karena mereka mungkin menggunakan sistem operasi dan / atau IDE yang berbeda.
  • File yang bukan milik proyek .gitignore, atau global.gitignore , dapat diabaikan dengan menggunakan repositori eksplisit tidak termasuk dalamyour_project_directory/.git/info/exclude . File ini tidak akan dibagikan dengan pengembang lain, dan khusus untuk repositori tunggal itu
Nic Wortel
sumber
Sebutan yang bagus untuk global.gitignore
Gruber
Saya pikir setelah pengaturan awal, file .gitignore harus diabaikan, sehingga tidak ada perubahan yang tidak disengaja. Itu tidak berarti tidak bisa diubah lagi, tetapi dilindungi dari kecelakaan. Kecelakaan pada file itu dapat menimbulkan kebingungan atau bahkan membahayakan beberapa pekerjaan, jadi "menyegel" (mengabaikan sendiri) harus dipertimbangkan juga.
Sasa
@Sasa .gitignorehanya berfungsi untuk mengabaikan file yang belum dilacak oleh Git. Menambahkan file yang sudah dilacak ke .gitignoretidak akan mencegah Anda melakukan perubahan pada file itu. Bahkan jika ini mungkin, bagaimana Anda akan melakukan perubahan .gitignoreketika itu memerintahkan Git untuk mengabaikannya sendiri?
Nic Wortel
@Nic - Saya telah mengirimkan penjelasan terperinci ke sudut pandang saya di balasan terpisah @ bagian bawah utas ini.
Sasa
12

Perhatikan "masalah" berikut ini. Terkadang Anda ingin menambahkan direktori tetapi tidak ada file di dalam direktori tersebut. Solusi sederhana adalah membuat .gitignore dengan konten berikut:

*

Ini berfungsi dengan baik sampai Anda menyadari bahwa direktori tidak ditambahkan (seperti yang diharapkan ke repositori Anda. Alasannya adalah bahwa .gitignore juga akan diabaikan, dan dengan demikian direktori tersebut kosong. Dengan demikian, Anda harus melakukan sesuatu seperti ini :

*
!.gitignore
Labirin
sumber
9

Tampaknya ini hanya berfungsi untuk direktori Anda saat ini Git untuk mengabaikan semua file dari repositori.

perbarui file ini

.git/info/exclude 

dengan kartu liar atau nama file Anda

*pyc
*swp
*~
Naskov
sumber
5

Jika Anda sudah check-in .gitignore dan Anda ingin mengabaikan modifikasi untuk itu, lihat jawaban ini :

Coba gunakan perintah ini:

git update-index --assume-unchanged FILENAME_TO_IGNORE

Untuk membalikkannya (jika Anda ingin melakukan perubahan), gunakan:

git update-index --no-assume-unchanged

PEMBARUAN :

Berikut cara daftar file 'asumsikan tidak berubah' di bawah direktori saat ini:

git ls-files -v | grep -E "^[a-z]"

Sebagai -vopsi akan menggunakan huruf kecil untuk file 'menganggap tidak berubah'.

Harun
sumber
4

Dalam kasus saya, saya ingin mengecualikan file yang ada. Hanya memodifikasi .gitignore tidak berfungsi. Saya mengikuti langkah-langkah ini:

git rm --cached dirToFile/file.php
vim .gitignore
git commit -a

Dengan cara ini, saya membersihkan dari cache file yang ingin saya kecualikan dan setelah saya menambahkannya ke .gitignore .

Andrea Perdicchia
sumber
solusi terbaik untuk saya. Anda juga dapat menggunakan git add. di tempat kedua, setelah itu git melakukan -m "memperbaiki .gitignore"
brainray
3

Arahkan ke direktori dasar git repo Anda dan jalankan perintah berikut:

echo '\\.*' >> .gitignore

Semua file dot akan diabaikan, termasuk .DS_Store sial itu jika Anda menggunakan mac.

weffen
sumber
4
Saya tidak akan melakukan itu. Mungkin ada file dot yang Anda butuhkan. Sebagai gantinya, saya hanya akan menambahkan .gitignore dan .DS_Store secara harfiah.
Edward Falk
2

Sangat mungkin bahwa pengguna akhir ingin agar Git mengabaikan file ".gitignore" hanya karena folder spesifik IDE yang dibuat oleh Eclipse mungkin tidak sama dengan NetBeans atau IDE lain. Jadi untuk menjaga kode sumber IDE antagonis itu membuat hidup mudah untuk memiliki custom git diabaikan yang tidak dibagikan dengan seluruh tim karena pengembang individu mungkin menggunakan IDE yang berbeda.

John Brown
sumber
1

.gitignoreadalah tentang mengabaikan file lain . git adalah tentang file, jadi ini tentang mengabaikan file. Namun ketika git bekerja dari file, file ini harus ada sebagai mekanisme untuk daftar nama file lainnya.

Jika itu disebut .the_list_of_ignored_filesmungkin sedikit lebih jelas.

Analogi adalah daftar item yang harus dilakukan yang TIDAK ingin Anda lakukan. Kecuali jika Anda membuat daftar di suatu tempat adalah semacam daftar 'yang harus dilakukan' Anda tidak akan tahu tentang mereka.

Michael Durrant
sumber
1

Saya pikir ada beberapa situasi di mana mengabaikan .gitignore sangat berguna. Misalnya, ketika Anda memiliki beberapa tim atau tim besar yang bekerja pada basis kode yang sama. Dalam hal ini, Anda perlu memiliki konvensi tertentu, salah satu konvensi tersebut adalah mengenai apa yang diabaikan di git repo. Biasanya tentang mengabaikan file dan direktori yang dibuat oleh IDE atau OS, beberapa log yang dihasilkan, dll.

Namun, ada kekuatan yang cenderung memperkenalkan perubahan non-konvensional ke .gitignorefile. Itu.gitignore file dapat lebih diubah oleh orang yang tidak bertanggung jawab, karena kesalahan, dengan alat yang digunakan, atau dalam beberapa kasus lainnya.

Untuk memiliki kekuatan balasan untuk ini, kita dapat melakukan hal berikut:

  1. .Gitignore awal harus mencerminkan konvensi dalam tim,
  2. Setelah didorong, .gitignore harus diamankan dengan menambahkan entri .gitignore dan dorong perubahan itu lagi. .gitignoreFile tersebut " disegel " dengan cara ini.

File " disegel " .gitignoredapat diubah, hanya secara lokal, tanpa menyebarkan perubahan itu kepada anggota tim lain. Namun, jika suatu perubahan disetujui secara luas di seluruh tim (s) daripada yang mungkin untuk "membuka segel" itu, mengubahnya dan dari "segel" itu lagi. Itu tidak bisa dilakukan secara tidak sengaja, hanya dengan sengaja.

Sayangnya, Anda tidak dapat 100% terlindungi dari kebodohan, tetapi dengan cara ini Anda telah melakukan semua yang Anda bisa untuk mencegah hal-hal bodoh terjadi.

Jika Anda memiliki tim yang relatif kecil dengan profesional yang sangat baik, daripada ini tidak akan penting, tetapi bahkan orang-orang itu akan menghargai memiliki satu hal yang kurang perlu dikhawatirkan.

Menggunakan .git/info/excludeitu keren ketika Anda tidak dapat melakukan apa pun tentang pengaturan infrastruktur, hanya menutupi ** Anda sendiri untuk tidak membuat kesalahan.

Dari sudut pandang apa yang benar dan apa yang salah, saya memilih untuk memiliki .gitignore masuk ke dalam .gitignorefile, memberikan semua orang kebebasan untuk melakukan secara lokal apa pun yang mereka inginkan, tetapi tidak menyerang orang lain.

Sasa
sumber
0

Saya menemukan bahwa tempat terbaik untuk mengatur pengabaian terhadap .DS_Storefile sial adalah dalam .git/info/excludefile.

IntelliJ tampaknya melakukan ini secara otomatis ketika Anda mengatur repositori git di dalamnya.

Stephen McConnell
sumber
1
File abaikan global pengguna akan menjadi tempat yang lebih baik untuk mengabaikan .DS_Store
Max Nanasy