Katakanlah saya telah mengabaikan sebuah direktori, tetapi saya ingin menghilangkan subdirektori tertentu di dalamnya. Jadi saya sudah menyiapkannya:
/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/
Dan saya ingin mengabaikan semuanya kecuali KEEP_ME
direktori. Saya berharap pengabaian akan terlihat seperti:
/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/
Tapi itu tidak berhasil, dan juga tidak ada beberapa permutasi pada tema yang sama.
Salah satu yang berhasil adalah
/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/
Tapi itu terasa sedikit membatasi dan bertele-tele?
Jawaban:
Menurut bagian format pola dari dokumentasi gitignore :
Oleh karena itu
/uploads/rubbish/stuff/keep/
pola direktori induk yang sebelumnya dikecualikan harus dinegasikan secara eksklusif sebelum meniadakan isinya:Untuk memasukkan subdirektori di dalam
/uploads/rubbish/stuff/keep/
tambahkan baris ketiga:sumber
.gitignore
dan itu berfungsi dengan baik !:!*.zip
Bahkan jika Anda menambahkan sesuatu
.gitignore
, Anda dapat memaksa git untuk menambahkannya ke indeksNamun, "KEEP_ME" tampaknya merupakan direktori dan git biasanya tidak menyukai folder kosong, jadi Anda harus menambahkan file pemegang "placeholder", jika folder tersebut kosong
sumber
git add --force
untuk setiap item atau folder baru diKEEP_ME
. tetapi setelah itu, pembaruan baru saja ditambahkan (ketika melakukangit add -u
misalnya) seolah-olah file tersebut 'tidak diabaikan'. Itu.keep_me
tidak melakukan apa-apa, itu hanya sebuah file sehingga git beroperasi pada folder tersebut.git add --force
adalah solusi yang salah untuk ini. Jika Anda memindahkan direktori atau memindahkan file ke direktori lain, pelacakan git akan menghapus file tetapi tidak menambahkannya ke lokasi baru dan Anda harus melakukannyagit add --force
lagi. dengan tidak mengabaikan pola umum, git akan melacak pergerakan file di dalam repo.Mencoba mencari cara untuk menyertakan folder tertentu saat mengecualikan semua folder dengan pengecualian umum
jika Anda menambahkan
/*
akhir dari pengecualian umum Anda, Anda terus mengecualikan semua file build**/build/*
Kemudian Anda menambahkan baris lain untuk mengoreksi jalur yang ingin Anda sertakan agar terlihat seperti
meninggalkan kami gitignore yang berbunyi
sumber
Jawaban Buo-Ren Lin dan John cukup membantu, tetapi saya perlu menggabungkan keduanya.
Ketika ingin mengecualikan sub-folder lain serta file dalam unggahan, saya merasa perlu untuk secara eksplisit menentukan direktori sewenang-wenang sebelum folder yang diberikan baik saat mengecualikan folder dan saat memasukkan sub-folder
Saya juga merasa perlu untuk secara eksplisit memasukkan kembali sub-folder dan isinya untuk menampilkan kedua item di dalam folder dan sub-folder.
sumber
Solusi yang disajikan sebagai jawaban dengan suara terbanyak adalah salah, dan dengan mudah dapat dibuktikan.
Mulailah dengan mengabaikan semua yang ada di unggahan / *:
Sekarang hilangkan direktori induk dari hal-hal yang diabaikan seperti di atas:
Tidak menampilkan file yang tidak terlacak.
Untuk membuatnya berfungsi, Anda perlu mengabaikan semua file di bawah
uploads/
pohon (uploads/**/*
, bukan hanya tingkat atas,uploads/*
) dan kemudian menambahkan semua direktori induk dari pohon yang ingin Anda pertahankanPemberian yang mana:
Jika kita telah menggunakan
uploads/*
di.gitignore
atas, maka semua file perantara akan disertakan juga, jadi misalnyauploads/rubbish/a
akan muncul di perintah status di atas.sumber