Bagaimana cara menambahkan file tanpa titik di dalamnya (semua file tanpa ekstensi) ke file gitignore?

111

Seperti judulnya, apakah mungkin untuk menambahkan "file tanpa titik di dalamnya" ke file gitignore?

Saya membayangkan ini akan mengurus semua file tanpa ekstensi yang mengganggu itu.

Kucing Unfun
sumber
2
Ada beberapa file extensionless yang Anda tidak ingin mengabaikan: README, LICENSEatau COPYING, INSTALL, Makefiledll, meskipun Anda selalu dapat memaksa-menambahkannya dan kemudian mereka dilacak
Jakub Narębski
@JakubN point poin yang bagus. Saya telah memasukkannya dalam jawaban saya untuk visibilitas lebih.
VonC
kemungkinan duplikat gitignore tanpa file biner
Mad Physicist

Jawaban:

121

Anda dapat mencoba kombinasi yang mirip dengan:

*
!/**/
!*.*

Itu gitignoreaturan pengecualian (a pola menegasikan ) harus mengabaikan semua file, kecuali orang-orang dengan ekstensi.

Seperti disebutkan di bawah oleh Fisikawan Gila , aturannya adalah:

Tidak mungkin untuk memasukkan kembali file jika direktori induk dari file itu dikecualikan. (*)
(*: kecuali kondisi tertentu terpenuhi di git 2.?+, lihat di bawah)

Itulah mengapa !/**/penting (daftar putih folder induk secara rekursif) jika kita ingin file daftar putih.

Saya menyebutkan aturan yang sama dalam kasus serupa seperti:


Seperti komentar Jakub Narębski , Anda mungkin tidak ingin mengabaikan semua file tanpa ekstensi.

Saranku:

  • tambahkan dulu file tanpa ekstensi yang penting
  • lalu edit Anda .gitignoreseperti yang ditunjukkan di atas: file yang sudah berversi tidak akan diabaikan (meskipun tidak memiliki ekstensi). Semua yang lain akan diabaikan.

Untuk file tanpa ekstensi di masa mendatang yang ingin Anda buat versinya:

git add -f -- myFile

Perhatikan bahwa dengan git 2.9.x / 2.10 (pertengahan 2016?), Dimungkinkan untuk menyertakan kembali file jika direktori induk dari file tersebut dikecualikan jika tidak ada karakter pengganti di jalur yang disertakan ulang .

Nguyễn Thái Ngọc Duy ( pclouds) mencoba menambahkan fitur ini:

Namun, karena salah satu aturan untuk memasukkan kembali adalah:

Bagian direktori dalam aturan penyertaan ulang harus literal (yaitu tidak ada karakter pengganti)

Ini tidak akan berhasil di sini.

VonC
sumber
1
Jawabannya benar sekali. Tapi mungkin yang lebih baik .gitignoreadalah **dan !**.*. Saya tahu ini tidak membuat perbedaan jika tanda bintang ditempatkan di depan, tetapi lebih eksplisit dan terdengar dengan cara cangkang menangani wildcard ...
Willem Van Onsem
7
Catatan: untuk bekerja dengan aturan pengecualian lainnya, ini harus menjadi kumpulan aturan pertama dalam file .gitignore Anda
Erik
Anda juga dapat memasukkan kembali file tanpa ekstensi tertentu misalnya dengan !Makefile. Berhati-hatilah karena saya mengalami masalah dengan solusi ini di Git 1.7.1 sementara solusi ini berfungsi dengan baik di 1.9.0. Dalam kasus saya, menambahkan file di direktori root berfungsi dengan baik, tetapi menambahkan file dengan ekstensi di dalam subdirektori ditampilkan sebagai diabaikan. Ini sepertinya karena 1.7.1 belum mendukung **pola tersebut, lihat di sini !
mxmlnkn
1
**ditambahkan di Git 1.8.2. Apakah ada kerugian dari penggunaan !*/daripada !/**/?
mxmlnkn
@TamaMcGlinn Itu terlihat seperti regex: gitignore tidak mendukung regex.
VonC
50
*
!*/
!*.*

* memberitahu git untuk mengabaikan semuanya.

!*/kemudian tidak mengabaikan apa pun yang merupakan direktori. Ini penting.

!*.* tidak mengabaikan semua file dengan ekstensi.

Tanpa !*/aturan, direktori tanpa .nama tidak akan terdaftar dan tidak ada file yang Anda inginkan yang akan ditambahkan di luar folder root.

Sebagai referensi, baca dua bagian berikut dalam dokumentasi .gitignore yang menonjol:

Awalan opsional "!" yang meniadakan pola; file apa pun yang cocok yang dikecualikan oleh pola sebelumnya akan disertakan lagi. Tidak mungkin untuk memasukkan kembali file jika direktori induk dari file itu dikecualikan. Git tidak mencantumkan direktori yang dikecualikan untuk alasan kinerja, jadi pola apa pun pada file yang ditampung tidak akan berpengaruh, di mana pun mereka didefinisikan. Letakkan garis miring terbalik ("\") di depan yang pertama "!" untuk pola yang dimulai dengan "!" literal, misalnya, "! penting! .txt".

Jika pola diakhiri dengan garis miring, itu dihapus untuk tujuan deskripsi berikut, tetapi hanya akan menemukan kecocokan dengan direktori. Dengan kata lain, foo / akan cocok dengan direktori foo dan path di bawahnya, tetapi tidak akan cocok dengan file biasa atau link simbolik foo (ini konsisten dengan cara kerja pathspec secara umum di Git).

Fisikawan Gila
sumber
1
Tangkapan yang bagus. +1. Saya lupa memperbarui jawaban saya dengan aturan yang baru-baru ini saya gunakan di jawaban tambang lainnya. Saya telah memperbarui jawaban saya.
VonC
0

Di folder saya ada banyak file dengan *.c, *.h, *.txt, *.csvekstensi dll. Dan file biner tanpa ekstensi apa pun. Jadi saya perlu mengabaikan semua file execpt *.c,*.hdan .gitignore, Jadi ini berfungsi untuk saya, dari .gitignorecontoh:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
Antranig Avakian
sumber