tl;dr: Pendekatan yang betul hendaklah: git rm --cached logs/xx.log, kemudian kemas kini .gitignore mengabaikan fail sasaran, dan akhirnya git commit -m "We really don't want Git to track this anymore!"
Sebab khusus adalah seperti berikut:
Walaupun jawapan yang diterima boleh mencapai tujuan (sementara), ia bukanlah pendekatan yang paling betul untuk salah faham makna git update-index, dan akibat yang paling langsung (tidak diingini) daripada berbuat demikian adalah seperti berikut:
Semua ahli pasukan mesti melaksanakan pada fail sasaran:
. Ini kerana walaupun anda membiarkan Git berpura-pura tidak melihat perubahan pada fail sasaran, fail itu sendiri masih dalam sejarah Git, jadi semua orang dalam pasukan akan menarik perubahan pada fail sasaran apabila git update-index --assume-unchanged <PATH>fetch dilaksanakan . (Tetapi sebenarnya, fail sasaran tidak mahu direkodkan oleh Git sama sekali, daripada berpura-pura tidak melihatnya berubah)
Sebaik sahaja seseorang menukar fail sasaran dan terus
tekangit update-index --assume-unchanged <PATH> tanpa , maka semua ahli yang telah menarik kod terkini mesti melaksanakan semula kemas kini-index , jika tidak Git akan mula merekodkan perubahan pada fail sasaran sekali lagi. Ini sebenarnya sangat biasa. Contohnya, jika ahli menukar mesin atau cakera keras dan klon pangkalan kod baharu, memandangkan fail sasaran masih dalam sejarah Git, dia mungkin Terlupa indeks kemas kini.
Mengapa ini berlaku? Jawapannya terletak pada
halaman manusia Git:
Pertama sekali, takrifan
git update-index ialah:
Daftar kandungan fail dalam pepohon kerja ke indeks (Daftar kandungan fail dalam ruang kerja ke kawasan indeks)
Maksud tersirat ayat ini ialah:
indeks kemas kini menyasarkan fail yang direkodkan dalam pangkalan data Git, bukan fail yang perlu diabaikan.
Kemudian lihat beberapa huraian berkaitan tentang
--anggap-tidak berubah:
Apabila bit "anggap tidak berubah" dihidupkan, Git berhenti menyemak fail pepohon yang berfungsi untuk kemungkinan pengubahsuaian, jadi anda perlu menyahset bit secara manual untuk memberitahu Git apabila anda menukar fail pepohon yang berfungsi projek besar pada sistem fail yang mempunyai panggilan sistem lstat(2) yang sangat perlahan (cth. cifs).
kira-kira bermaksud:
Selepas menggunakan bendera ini, Git berhenti melihat kemungkinan perubahan pada fail ruang kerja, jadi anda mesti
secara manual menetapkan semula bendera supaya Git tahu anda mahu menyambung semula penjejakan perubahan fail. Ini boleh berguna apabila anda menjalankan projek besar apabila panggilan sistem sistem fail sangat lambat. lstat
Kami tahu bahawa Git bukan sahaja digunakan untuk pengurusan versi kod, tetapi banyak projek dalam bidang lain juga menggunakan Git. Sebagai contoh, salah satu projek pelanggan syarikat kami melibatkan pengurusan versi dokumen lukisan bahagian ketepatan, dan mereka juga menggunakan Git. Satu senario penggunaan adalah untuk mengubah suai beberapa fail besar, tetapi setiap kali Git menyimpannya, ia mesti mengira perubahan dalam fail dan mengemas kini ruang kerja Kelewatan ini sangat jelas apabila cakera keras perlahan.
Penggunaan sebenar
git update-index --assume-unchanged ialah ini:
Anda sedang mengubah suai fail yang besar, anda harus git update-index --assume-unchanged dahulu, supaya Git akan mengabaikan pengubahsuaian anda pada fail itu buat sementara waktu;
Apabila kerja anda selesai dan sedia untuk diserahkan, tetapkan semula bendera perubahan:
, jadi Git hanya perlu mengemas kini sekali sahaja, yang boleh diterima sepenuhnya;
git update-index --no-assume-unchangedSerah + tolak.
Juga, mengikut penerangan lanjut dalam dokumentasi:
Pilihan ini juga boleh digunakan sebagai mekanisme peringkat fail
kasar
untuk mengabaikan perubahan tidak komited dalam fail yang dijejaki (sama seperti apa yang .gitignore lakukan untuk fail tidak dijejaki).
Penerangan ini memberitahu kita dua fakta:
Walaupun ia boleh digunakan untuk mencapai hasil yang dikehendaki oleh poster, ia bukanlah pendekatan yang halus (kasar);
Perkara yang sama harus dicapai menggunakan
fail (untuk fail yang tidak dijejaki).
.gitignorePersoalan yang timbul ialah:
Mengapa saya menambah peraturan dalam .gitignore
tetapi ia tidak memberi kesan? Ini kerana kami salah faham tujuan fail .gitignore
, yang hanya boleh digunakan pada
Fail Tidak Dijejaki, iaitu fail yang tidak pernah telah direkodkan oleh fail Git (fail yang tidak pernah ditambah atau dilakukan sejak ia ditambah). Sebab peraturan anda tidak berkuat kuasa adalah kerana fail tersebut telah direkodkan oleh Git, jadi
adalah tidak sah sama sekali untuknya. Inilah yang dilakukan oleh jawapan ringkas pada permulaan:
.log.gitignoreAlih keluar penjejakan fail daripada pangkalan data Git;
Tulis peraturan yang sepadan ke dalam .gitignore
untuk membuat pengabaian berkuat kuasa;
Serah + tolak.
Hanya dengan melakukan ini, semua ahli pasukan akan konsisten tanpa kesan sampingan, dan hanya dengan melakukan ini, ahli pasukan lain tidak perlu melakukan kerja tambahan sama sekali untuk mengekalkan ketidaktahuan perubahan pada fail.
Satu perkara terakhir yang perlu diambil perhatian,
memadamkan status penjejakan, bukan fail fizikal; jika anda benar-benar tidak mahukannya, anda juga boleh terus +abaikan+serahkan.
Untuk fail yang telah diselenggara, malah menambah gitignore tidak akan membantu.
Gunakan arahan berikut: git update-index --assume-unchanged logs/*.log
Dengan cara ini, fail di bawah log tidak akan muncul setiap kali anda menyerahkan
Beri saya jawapan terperinci
.gitignore hanya boleh mengabaikan fail yang tidak dijejaki pada asalnya Jika sesetengah fail telah disertakan dalam pengurusan versi, mengubah suai .gitignore adalah tidak sah.
Pendekatan yang betul adalah dengan menetapkan secara manual dalam setiap gudang yang diklon bukan untuk menyemak perubahan pada fail tertentu.
Selain itu, git juga menyediakan satu lagi kaedah exclude untuk melakukan perkara yang sama Perbezaannya ialah fail .gitignore itu sendiri akan diserahkan kepada repositori. Digunakan untuk menyimpan fail awam yang perlu dikecualikan. Dan .git/info/exclude menetapkan di sini fail yang anda perlu kecualikan secara setempat. Dia tidak akan menjejaskan orang lain. Ia tidak akan diserahkan kepada repositori.
.gitignore juga mempunyai fungsi kecil yang menarik Fail .gitignore kosong boleh digunakan sebagai ruang letak. Ini menjadi berguna apabila anda perlu mencipta direktori log kosong untuk projek anda. Anda boleh mencipta direktori log dan meletakkan fail .gitignore kosong di dalamnya. Dengan cara ini, apabila anda mengklon repo ini, git akan membuat direktori log kosong secara automatik.
Saya mendapati bahawa jawapan dengan bilangan undian tertinggi (n͛i͛g͛h͛t͛i͛r͛e͛) tidak memahami soalan itu sama sekali Sebaliknya, jawapan @FatGhosta ialah jawapan yang betul
Jika anda mengikuti kaedah n ͛i ͛ g ͛ h ͛ t ͛i ͛ r ͛e ͛ , ia hanya akan mencapai "Padam fail yang tidak perlu direkodkan daripada git sambil mengekalkan fail secara setempat dan abaikan ia pada masa hadapan commit" bukannya mencapai "Abaikan fail yang sudah wujud dalam git apabila melakukan"
Sebenarnya, adegan sepatutnya seperti ini, terdapat fail konfigurasi, seperti maklumat pautan pangkalan data Maklumat pautan setiap orang pastinya tidak sama, tetapi templat standard mesti disediakan untuk memberitahu cara untuk melakukannya. isi maklumat pautan Kemudian Terdapat situasi di mana anda perlu merekodkan fail konfigurasi standard pada git dan kemudian semua orang mengkonfigurasi salinan maklumat pautan untuk kegunaan mereka sendiri mengikut keadaan khusus mereka sendiri, tetapi tidak menyerahkan fail konfigurasi ke perpustakaan Oleh itu, jawapan FatGhosta adalah jawapan yang betul untuk soalan ini
tl;dr: Pendekatan yang betul hendaklah:
git rm --cached logs/xx.log
, kemudian kemas kini.gitignore
mengabaikan fail sasaran, dan akhirnyagit commit -m "We really don't want Git to track this anymore!"
Sebab khusus adalah seperti berikut:
Walaupun jawapan yang diterima boleh mencapai tujuan (sementara), ia bukanlah pendekatan yang paling betul untuk salah faham makna
git update-index
, dan akibat yang paling langsung (tidak diingini) daripada berbuat demikian adalah seperti berikut:. Ini kerana walaupun anda membiarkan Git berpura-pura tidak melihat perubahan pada fail sasaran, fail itu sendiri masih dalam sejarah Git, jadi semua orang dalam pasukan akan menarik perubahan pada fail sasaran apabila
git update-index --assume-unchanged <PATH>
fetch dilaksanakan . (Tetapi sebenarnya, fail sasaran tidak mahu direkodkan oleh Git sama sekali, daripada berpura-pura tidak melihatnya berubah)tekan
git update-index --assume-unchanged <PATH>
tanpa , maka semua ahli yang telah menarik kod terkini mesti melaksanakan semula kemas kini-index , jika tidak Git akan mula merekodkan perubahan pada fail sasaran sekali lagi. Ini sebenarnya sangat biasa. Contohnya, jika ahli menukar mesin atau cakera keras dan klon pangkalan kod baharu, memandangkan fail sasaran masih dalam sejarah Git, dia mungkin Terlupa indeks kemas kini.halaman manusia Git:
Pertama sekali, takrifangit update-index ialah:
Maksud tersirat ayat ini ialah:indeks kemas kini menyasarkan fail yang direkodkan dalam pangkalan data Git, bukan fail yang perlu diabaikan.
Kemudian lihat beberapa huraian berkaitan tentang--anggap-tidak berubah:
kira-kira bermaksud:Kami tahu bahawa Git bukan sahaja digunakan untuk pengurusan versi kod, tetapi banyak projek dalam bidang lain juga menggunakan Git. Sebagai contoh, salah satu projek pelanggan syarikat kami melibatkan pengurusan versi dokumen lukisan bahagian ketepatan, dan mereka juga menggunakan Git. Satu senario penggunaan adalah untuk mengubah suai beberapa fail besar, tetapi setiap kali Git menyimpannya, ia mesti mengira perubahan dalam fail dan mengemas kini ruang kerja Kelewatan ini sangat jelas apabila cakera keras perlahan.
Penggunaan sebenargit update-index --assume-unchanged
ialah ini:git update-index --assume-unchanged
dahulu, supaya Git akan mengabaikan pengubahsuaian anda pada fail itu buat sementara waktu;git update-index --no-assume-unchanged
Serah + tolak.Perkara yang sama harus dicapai menggunakan- fail (untuk fail yang tidak dijejaki).
-
Mengapa saya menambah peraturan dalam
.gitignore.gitignore
Persoalan yang timbul ialah:tetapi ia tidak memberi kesan? Ini kerana kami salah faham tujuan fail .gitignore
, yang hanya boleh digunakan padaFail Tidak Dijejaki, iaitu fail yang tidak pernah telah direkodkan oleh fail Git (fail yang tidak pernah ditambah atau dilakukan sejak ia ditambah). Sebab peraturan anda tidak berkuat kuasa adalah kerana fail tersebut telah direkodkan oleh Git, jadi
adalah tidak sah sama sekali untuknya. Inilah yang dilakukan oleh jawapan ringkas pada permulaan:.log
.gitignore
Alih keluar penjejakan fail daripada pangkalan data Git;.gitignore- untuk membuat pengabaian berkuat kuasa;
Serah + tolak. -
Hanya dengan melakukan ini, semua ahli pasukan akan konsisten tanpa kesan sampingan, dan hanya dengan melakukan ini, ahli pasukan lain tidak perlu melakukan kerja tambahan sama sekali untuk mengekalkan ketidaktahuan perubahan pada fail.
- Satu perkara terakhir yang perlu diambil perhatian,
memadamkan status penjejakan, bukan fail fizikal; jika anda benar-benar tidak mahukannya, anda juga boleh terus
+abaikan+serahkan.Untuk fail yang telah diselenggara, malah menambah gitignore tidak akan membantu.
Gunakan arahan berikut:
git update-index --assume-unchanged logs/*.log
Dengan cara ini, fail di bawah log tidak akan muncul setiap kali anda menyerahkan
Beri saya jawapan terperinci
.gitignore hanya boleh mengabaikan fail yang tidak dijejaki pada asalnya Jika sesetengah fail telah disertakan dalam pengurusan versi, mengubah suai .gitignore adalah tidak sah.
Pendekatan yang betul adalah dengan menetapkan secara manual dalam setiap gudang yang diklon bukan untuk menyemak perubahan pada fail tertentu.
Selain itu, git juga menyediakan satu lagi kaedah exclude untuk melakukan perkara yang sama Perbezaannya ialah fail .gitignore itu sendiri akan diserahkan kepada repositori. Digunakan untuk menyimpan fail awam yang perlu dikecualikan. Dan .git/info/exclude menetapkan di sini fail yang anda perlu kecualikan secara setempat. Dia tidak akan menjejaskan orang lain. Ia tidak akan diserahkan kepada repositori.
.gitignore juga mempunyai fungsi kecil yang menarik Fail .gitignore kosong boleh digunakan sebagai ruang letak. Ini menjadi berguna apabila anda perlu mencipta direktori log kosong untuk projek anda. Anda boleh mencipta direktori log dan meletakkan fail .gitignore kosong di dalamnya. Dengan cara ini, apabila anda mengklon repo ini, git akan membuat direktori log kosong secara automatik.
Padamkan fail log, tambah ingore dan komit semula
Saya mendapati bahawa jawapan dengan bilangan undian tertinggi (n͛i͛g͛h͛t͛i͛r͛e͛) tidak memahami soalan itu sama sekali
Sebaliknya, jawapan @FatGhosta ialah jawapan yang betul
Jika anda mengikuti kaedah n ͛i ͛ g ͛ h ͛ t ͛i ͛ r ͛e ͛ , ia hanya akan mencapai
"Padam fail yang tidak perlu direkodkan daripada git sambil mengekalkan fail secara setempat dan abaikan ia pada masa hadapan commit"
bukannya mencapai
"Abaikan fail yang sudah wujud dalam git apabila melakukan"
Sebenarnya, adegan sepatutnya seperti ini, terdapat fail konfigurasi, seperti maklumat pautan pangkalan data
Maklumat pautan setiap orang pastinya tidak sama, tetapi templat standard mesti disediakan untuk memberitahu cara untuk melakukannya. isi maklumat pautan
Kemudian Terdapat situasi di mana anda perlu merekodkan fail konfigurasi standard pada git dan kemudian semua orang mengkonfigurasi salinan maklumat pautan untuk kegunaan mereka sendiri mengikut keadaan khusus mereka sendiri, tetapi tidak menyerahkan fail konfigurasi ke perpustakaan
Oleh itu, jawapan FatGhosta adalah jawapan yang betul untuk soalan ini