Kedua contoh dalam pertanyaan tersebut adalah contoh yang sangat buruk yang dapat menyebabkan hilangnya data!
Saran saya: jangan pernah menambahkan /*
direktori ke file .gitignore, kecuali Anda punya alasan bagus!
Alasan yang bagus adalah misalnya apa yang ditulis Jefromi: "jika Anda berniat untuk kemudian mengabaikan sesuatu di direktori" .
Alasan mengapa itu seharusnya tidak dilakukan adalah penambahan itu /*
direktori pada satu sisi berfungsi dengan cara yang mengabaikan semua isi direktori dengan benar, tetapi di sisi lain itu memiliki efek samping yang berbahaya:
Jika Anda mengeksekusi git stash -u
(untuk sementara menyimpan file yang dilacak dan tidak dilacak) atau git clean -df
(untuk menghapus file yang tidak terlacak tetapi tetap diabaikan) di repositori Anda, semua direktori yang diabaikan dengan yang ditambahkan /*
akan dihapus secara permanen !
Beberapa latar belakang
Saya harus belajar ini dengan cara yang sulit. Seseorang di tim saya menambahkan /*
ke beberapa direktori di .gitignore kami. Seiring waktu saya memiliki kesempatan di mana direktori tertentu akan tiba-tiba menghilang. Direktori dengan gigabytes data lokal yang dibutuhkan oleh aplikasi kita. Tidak ada yang bisa menjelaskannya dan saya selalu ingin mengunduh ulang semua data. Setelah beberapa saat saya mendapat gagasan bahwa itu mungkin ada hubungannya dengan git stash
. Suatu hari saya ingin membersihkan repo lokal saya (sambil menyimpan file yang diabaikan) dan saya menggunakan git clean -df
dan lagi data saya hilang. Kali ini saya sudah cukup dan menyelidiki masalah ini. Saya akhirnya tahu bahwa alasannya adalah ditambahkan /*
.
Saya berasumsi itu bisa dijelaskan entah bagaimana oleh fakta yang directory/*
mengabaikan semua isi direktori tetapi bukan direktori itu sendiri. Karena itu tidak dianggap dilacak atau diabaikan ketika hal-hal dihapus. Meski begitu git status
dan git status --ignored
memberikan gambaran yang sedikit berbeda di atasnya.
Bagaimana cara mereproduksi
Inilah cara mereproduksi perilaku. Saat ini saya menggunakan Git 2.8.4.
Direktori yang disebut localdata/
dengan file dummy di dalamnya ( important.dat
) akan dibuat di repositori git lokal dan isinya akan diabaikan dengan memasukkan /localdata/*
ke dalam .gitignore
file tersebut. Ketika salah satu dari dua perintah git yang disebutkan dijalankan sekarang, direktori tersebut akan (secara tak terduga) hilang.
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
Jika Anda melakukannya di git status --ignored
sini, Anda akan mendapatkan:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
Sekarang lakukan
git stash -u
git stash pop
atau
git clean -df
Dalam kedua kasus direktori yang diduga diabaikan localdata
akan hilang!
Tidak yakin apakah ini dapat dianggap bug, tapi saya kira itu setidaknya fitur yang tidak diperlukan siapa pun.
Saya akan melaporkannya ke daftar pengembangan git dan melihat apa yang mereka pikirkan tentang itu.
.gitignore
membedakan antara file dan direktori yang diabaikannya? misalnya, apakahdata
vsdata/
bermakna berbeda?