Daftar putih dan subdirektori di Git

92

Saya telah membuat daftar putih untuk file teks saja.

*
!*.txt

Sekarang, saya memiliki file teks yang tidak terlacak dalam sub-direktori - sub/dir/file.txt, dan ini TIDAK ditampilkan (diabaikan). Namun, file teks di direktori root akan ditampilkan.

Mengapa demikian, dan bagaimana cara memperbaikinya?

Nate
sumber
1
Terkait: stackoverflow.com/q/987142/78845
Johnsyweb
Apakah file yang ingin Anda masukkan ke dalam sub direktori? Jika demikian, sub direktori ini mungkin sudah diabaikan oleh bintang pertama di Anda .gitignore.
fajran
Iya. File-file ini akan berada dalam struktur direktori serendah folder 11.1.102.55 dalam contoh saya. Penumpukan tidak selalu sama di antara folder / produk.
Nate
1
Saya tahu tentang fungsi ini. Kami memiliki ratusan direktori. Akan lebih cepat jika mengabaikan secara eksplisit tipe file yang tidak kita inginkan daripada membuat satu gitignore untuk setiap direktori. Saya benar-benar mencari cara untuk mendapatkan fungsionalitas daftar putih dari file .gitignore.
Nate
1
Saya tidak melihat bagaimana ini adalah duplikat. Pertanyaan lain menanyakan cara memasukkan file tertentu ke daftar putih, sedangkan pertanyaan ini menanyakan cara memasukkan jenis file tertentu ke daftar putih termasuk subfolder. Sebenarnya, ini lebih seperti duplikat stackoverflow.com/questions/8024924/… .
Big McLargeHuge

Jawaban:

147

Jika Anda mencobanya seperti itu, itu akan gagal, karena Anda akan berakhir dengan daftar hitam direktori dalam struktur Anda.

Untuk mengatasinya, Anda ingin memasukkan semua yang bukan direktori ke daftar hitam, dan bukan salah satu jenis file yang ingin Anda komit, sementara tidak memasukkan direktori ke daftar hitam .

The .gitignorefile yang akan melakukan ini:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

Menguji ini dalam daftar putih struktur tiga tingkat untuk .txtfile di hadapan *.one, *.twodan *.threefile menggunakan yang .gitignoreterletak di direktori akar repositori - berfungsi untuk saya. Anda tidak perlu menambahkan .gitignorefile ke semua direktori dalam struktur Anda.

Informasi yang saya gunakan untuk mengetahui jawabannya berasal dari, antara lain, ini (stackoverflow.com).

simont
sumber
18
Anda juga membutuhkan entri !.gitignore, saat menggunakan *, bukan?
sjas
2
Lihat jawaban saya di sini: stackoverflow.com/questions/987142/… Mungkin lebih berguna untuk menggunakan /*daftar hitam folder tingkat atas saja, tetapi tidak semua folder secara rekursif, yang sebenarnya berarti .gitignoretidak boleh melihat ke subfolder folder yang masuk daftar putih.
Ryan Taylor
3

Cara yang lebih sederhana untuk mencapai ini adalah:

# Ignore all files...
*.*

# ...except the ones we want
!*.txt

Ini berfungsi karena gitignoremenerapkan pola yang tidak dimulai dengan /setiap tingkat di bawah .gitignorefile:

Jika ada pemisah di awal atau tengah (atau keduanya) pola, maka pola tersebut relatif terhadap tingkat direktori dari file .gitignore itu sendiri. Jika tidak, polanya juga bisa cocok di semua level di bawah level .gitignore.

Jika Anda ingin melakukan ini ke file di dalam direktori , segalanya menjadi lebih kompleks:

# Ignore all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

Ini berfungsi karena gitignorememiliki aturan khusus untuk **:

Dua tanda bintang yang berurutan (" **") dalam pola yang cocok dengan nama jalur lengkap mungkin memiliki arti khusus:

  • Garis miring diikuti oleh dua tanda bintang berturut-turut, garis miring cocok dengan nol atau lebih direktori. Misalnya, " a/**/b" cocok " a/b", " a/x/b", " a/x/y/b" dan seterusnya.

Bagian kuncinya adalah memastikan Anda tidak mengabaikan direktori, karena setiap file di dalam direktori itu diabaikan terlepas dari aturan lainnya.

Sharadh
sumber
0

Saya mencari lama sekali:

  1. Asumsikan saya memiliki struktur folder besar dengan ~ 100.000 direktori bersarang secara rekursif. Di folder-folder tersebut, ada sekitar 30.000 jenis file .txt(dalam kasus saya: type *.md). Di samping *.mdfile - file ini , ada, katakanlah, 500GB dari (satu juta +) file yang tidak ingin saya lacak.

  2. Saya ingin git hanya melacak .txt(atau *.md) file di semua folder dan subdir.

Jawaban yang benar seharusnya: ini tidak mungkin dilakukan di Git.

Yang saya lakukan sebagai gantinya:

[edit: juga tidak berfungsi - Saya mencoba membuat folder dengan symlink (atau hardlink) dan menggunakan git di sana, tetapi git tidak mengikuti symlink dan menimpa hardlink. Doh!]

Alex
sumber