Saya bingung tentang cara apa yang benar untuk mengabaikan konten direktori di git.
Asumsikan saya memiliki struktur direktori berikut:
my_project
|--www
|--1.txt
|--2.txt
|--.gitignore
Apa perbedaan antara meletakkan ini:
www
Dan ini?
www/*
Alasan saya menanyakan pertanyaan ini adalah: Dalam git, jika direktori kosong, git tidak akan menyertakan direktori kosong tersebut dalam repositori. Jadi saya mencoba solusi yaitu menambahkan file .gitkeep ekstra di bawah direktori sehingga tidak akan kosong. Ketika saya mencoba solusi itu, jika di file .gitignore, saya menulis seperti di bawah ini:
www
!*.gitkeep
Itu tidak berhasil (Tujuan saya adalah mengabaikan semua konten di bawah www tetapi simpan direktori). Tetapi jika saya mencoba yang berikut:
www/*
!*.gitkeep
Kemudian berhasil! Jadi saya pikir itu pasti memiliki beberapa perbedaan antara kedua pendekatan tersebut.
bin
danbin/
adalah bahwa yang pertama akan mengabaikan file atau folder, yang terakhir hanya folder. Saya tidak tahu bedanya denganbin/*
Jawaban:
Ada perbedaan antara
www
,www/
danwww/*
.Pada dasarnya dari dokumentasi dan tes saya sendiri,
www
temukan yang cocok dengan file atau direktori,www/
hanya cocok dengan direktori, sedangkanwww/*
cocok dengan direktori dan file di dalamnyawww
.Saya hanya akan membahas tentang perbedaan antara
www/
dan diwww/*
sini, karena perbedaan antarawww
danwww/
sudah jelas.Karena
www/
, git mengabaikan direktoriwww
itu sendiri, yang berarti git tidak akan melihat ke dalam. Tetapi untukwww/*
, git memeriksa semua file / folder di dalamnyawww
, dan mengabaikan semuanya dengan pola*
. Tampaknya mengarah ke hasil yang sama karena git tidak akan melacak folder kosongwww
jika semua file / folder turunannya diabaikan. Dan memang hasilnya tidak akan ada perbedaan untuk kasus OP denganwww/
atauwww/*
standalone. Tetapi akan membuat perbedaan jika digabungkan dengan aturan lain.Misalnya, bagaimana jika kita hanya ingin memasukkan
www/1.txt
tetapi mengabaikan semua yang lain di dalamnyawww
?Berikut
.gitignore
ini tidak akan berhasil.Sementara berikut ini
.gitignore
berhasil, mengapa?Untuk yang pertama, git mengabaikan direktori
www
, dan tidak akan melihat ke dalam untuk memasukkannyawww/1.txt
lagi. Aturan pertama mengecualikan direktori indukwww
tetapi tidakwww/1.txt
, dan akibatnyawww/1.txt
tidak dapat " disertakan lagi ".Tetapi untuk yang terakhir, git pertama-tama mengabaikan semua file / folers di bawah
www
, dan kemudian memasukkan salah satunya lagi yaituwww/1.txt
.Untuk contoh ini, baris berikut dalam dokumentasi dapat membantu:
sumber
www/1.txt
dan kemudianwww/
akan melakukan hal yang sama dengan pendekatan kedua ...Saya hanya memilah-milah dokumentasi, dan sejauh yang saya tahu mereka hanya berbeda dalam pola yang lebih maju, mis
Saya melakukan tes di atas, dan jika Anda menggantinya
!/foo
dengan!/foo/*
, Anda memang mendapatkan hasil yang berbeda.Catatan
Akan mengecualikan file apa pun
foo
, tetapihanya akan mengecualikan direktori bernama foo.
sumber
Terlepas dari jawaban yang sangat bagus yang telah Anda peroleh, Anda harus mencatat bahwa Anda dapat memiliki
.gitignore
di mana saja dalam proyek Anda, termasuk subfolder.Jadi jika Anda ingin mengabaikan semua file di dalamnya
www
, tetapi inginwww
folder diversi, alih-alih menggunakan kosong.gitkeep
,.dummy
atau nama apa pun yang Anda pilih, mengapa tidak menggunakan di.gitignore
sana, menyuruh untuk mengabaikan semua file?Di root
.gitignore
(a), Anda tidak mengatakan apa pun tentangwww
folder atau isinya.Di
www/.gitignore
(b) Anda memasukkan yang berikut:Dengan cara ini semuanya terlihat lebih terorganisir (setidaknya bagi saya).
sumber
Untuk mengabaikan semua yang ada di direktori kecuali dotfiles, Anda dapat menggunakan pola-glob berikut di
.gitignore
:Jadi tidak perlu tambahan
.gitignore
, cukup tambahkan.keep
file kewww
direktori Anda .sumber