Saya mencoba untuk memecahkan masalah gitignore pada struktur direktori besar, tetapi untuk menyederhanakan pertanyaan saya, saya telah mengurangi itu sebagai berikut.
Saya memiliki struktur direktori berikut dari dua file (foo, bar) di repositori git baru (tidak ada komitmen sejauh ini):
a/b/c/foo
a/b/c/bar
Jelas, 'git status -u' menunjukkan:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
Yang ingin saya lakukan adalah membuat file .gitignore yang mengabaikan segala sesuatu di dalam a / b / c tetapi tidak mengabaikan file 'foo'.
Jika saya membuat .gitignore demikian:
c/
Kemudian 'git status -u' menunjukkan foo dan bar sebagai diabaikan:
# Untracked files:
...
# .gitignore
Seperti yang saya harapkan.
Sekarang jika saya menambahkan aturan pengecualian untuk foo, dengan demikian:
c/
!foo
Menurut halaman gitignore, saya berharap ini bekerja. Tetapi tidak - masih mengabaikan foo:
# Untracked files:
...
# .gitignore
Ini juga tidak bekerja:
c/
!a/b/c/foo
Ini juga tidak:
c/*
!foo
Memberi:
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
Dalam hal ini, meskipun foo tidak lagi diabaikan, bilah juga tidak diabaikan.
Urutan aturan di .gitignore juga tidak masalah.
Ini juga tidak melakukan apa yang saya harapkan:
a/b/c/
!a/b/c/foo
Yang itu mengabaikan foo dan bar.
Satu situasi yang berhasil adalah jika saya membuat file a / b / c / .gitignore dan dimasukkan ke sana:
*
!foo
Tetapi masalah dengan ini adalah bahwa pada akhirnya akan ada subdirektori lain di bawah a / b / c dan saya tidak ingin harus meletakkan .gitignore terpisah ke setiap satu - saya berharap untuk membuat 'berbasis proyek' .gitignore file yang dapat duduk di direktori teratas dari setiap proyek, dan mencakup semua struktur subdirektori 'standar'.
Ini juga tampaknya setara:
a/b/c/*
!a/b/c/foo
Ini mungkin hal yang paling dekat dengan "bekerja" yang dapat saya capai, tetapi jalur relatif penuh dan pengecualian eksplisit perlu dinyatakan, yang akan menyebalkan jika saya memiliki banyak file nama 'foo' di tingkat yang berbeda dari pohon subdirektori.
Bagaimanapun, entah saya tidak begitu mengerti bagaimana aturan pengecualian bekerja, atau mereka tidak bekerja sama sekali ketika direktori (bukan wildcard) diabaikan - oleh aturan yang berakhiran a /
Adakah yang bisa menjelaskan hal ini?
Apakah ada cara untuk membuat gitignore menggunakan sesuatu yang masuk akal seperti ekspresi reguler alih-alih sintaksis berbasis canggung yang canggung ini?
Saya menggunakan dan mengamati ini dengan git-1.6.6.1 di Cygwin / bash3 dan git-1.7.1 di Ubuntu / bash3.