Bagaimana cara kerja pola negasi di .gitignore?

94

Saya mencoba menggunakan file .gitignore dengan pola yang dinegasikan (baris dimulai dengan!), Tetapi tidak berfungsi seperti yang saya harapkan.

Sebagai contoh minimal, saya memiliki struktur direktori berikut:

C:/gittest
 -- .gitignore
 -- aaa/
   -- bbb/
     -- file.txt
   -- ccc/
     -- otherfile.txt

dan di file gitignore saya, saya memiliki ini:

aaa/
!aaa/ccc/

Pemahaman saya (berdasarkan halaman doc ini ) adalah bahwa file aaa / ccc / otherfile.txt tidak boleh diabaikan, tetapi sebenarnya git mengabaikan semua yang ada di bawah aaa.

Apakah saya salah memahami kalimat ini: "Awalan opsional! Yang meniadakan pola; file apa pun yang cocok yang dikecualikan oleh pola sebelumnya akan disertakan lagi."?

BTW, ini di Windows dengan msysgit 1.7.0.2.

Chris Perkins
sumber

Jawaban:

163

Saya pikir apa yang sebenarnya ingin Anda lakukan adalah:

aaa/*
!aaa/ccc

Anda mengatakan "jangan melihat ke dalam aaa" sehingga ia bahkan tidak pernah memeriksa jalannya aaa/ccc. Jika Anda menggunakan karakter pengganti, itu masih membaca konten aaa, lalu setiap entri cocok dengan karakter pengganti dan diabaikan, kecuali aaa/cccyang dimasukkan kembali.

Bertingkat
sumber
2
@ iconoclast: Maka Anda mungkin melakukan sesuatu yang berbeda. Posting pertanyaan lain (dengan informasi lengkap) jika Anda membutuhkan bantuan.
Cascabel
Ini juga tidak berhasil untuk saya: / apps / *! / Apps / myApps / FluidTest / bin /
Jarrod Smith
5
@Jarrod Itu berhasil; Anda hanya melakukan sesuatu yang berbeda. Anda harus menggunakan metode ini secara rekursif, untuk alasan yang diberikan dalam jawaban. ! apps / myApps, apps / myApps / * dan seterusnya.
Cascabel
Ahh maaf saya mengerti sekarang. Tapi SO tidak akan membiarkan saya memberi suara positif lagi.
Jarrod Smith
Bertanya-tanya mengapa itu tidak berhasil untuk aaa / ** / *! Aaa / ccc / eee (abaikan semuanya, kecuali file di jalur tertentu)
Phương Nguyễn
23

Jika Anda ingin mengecualikan semua yang ada di aaa, tetapi menyertakan aaa/cccdan semua yang ada di bawahnya, Anda harus menggunakan:

aaa/*
!aaa/ccc
!aaa/ccc/*

Baris pertama memberitahu git untuk mengabaikan semua yang ada di bawahnya aaa, baris kedua memberitahu untuk tidak mengabaikan folder aaa/cccyang sebenarnya "mengaktifkan" baris ketiga yang kemudian memberitahu untuk tidak mengabaikan semua yang ada di bawahnya aaa/ccc.

xmak
sumber
1
Baris ketiga tidak ada bedanya bagi saya.
James Hopkin
3
Untuk dapat meliputi segala sesuatu dalam subdirektori dari aaa/cccdi tingkat manapun, yang bekerja untuk saya adalah !aaa/ccc/**bukan!aaa/ccc/*
boclodoa
3

Jika ada yang masih tidak melihat item baru un-diabaikan dalam git statusmenjalankan git update-indexsebelum tangan dapat membantu git untuk melihat perubahan (setidaknya dalam versi 1.9.x dari gitbash).

alexkb.dll
sumber