Saya tidak berpikir komit Git dapat merekam niat seperti "berhenti melacak file ini, tetapi jangan menghapusnya".
Mengaktifkan niat seperti itu akan memerlukan intervensi di luar Git dalam setiap repositori yang menggabungkan (atau rebase) komit yang menghapus file.
Simpan Salinan, Terapkan Penghapusan, Pulihkan
Mungkin hal termudah untuk dilakukan adalah memberi tahu pengguna hilir Anda untuk menyimpan salinan file, tarik penghapusan Anda, lalu pulihkan file tersebut. Jika mereka menarik melalui rebase dan 'membawa' modifikasi ke file, mereka akan mendapatkan konflik. Untuk menyelesaikan konflik seperti itu, gunakan git rm foo.conf && git rebase --continue
(jika komit yang bertikai memiliki perubahan selain yang ke file yang dihapus) atau git rebase --skip
(jika komit yang bertikai hanya berubah menjadi file yang dihapus).
Pulihkan File sebagai Tidak Terlacak Setelah Menarik Komit yang Menghapusnya
Jika mereka sudah menarik komit penghapusan Anda, mereka masih dapat memulihkan versi file sebelumnya dengan git show :
git show @{1}:foo.conf >foo.conf
Atau dengan git checkout (per komentar oleh William Pursell; tetapi jangan lupa untuk menghapusnya kembali dari indeks!):
git checkout @{1} -- foo.conf && git rm --cached foo.conf
Jika mereka telah mengambil tindakan lain sejak menarik penghapusan Anda (atau mereka menarik dengan rebase ke KEPALA terpisah), mereka mungkin membutuhkan sesuatu selain @{1}
. Mereka dapat digunakan git log -g
untuk menemukan komit tepat sebelum mereka menarik penghapusan Anda.
Dalam komentar, Anda menyebutkan bahwa file yang ingin Anda “lacak, tetapi simpan” adalah beberapa jenis file konfigurasi yang diperlukan untuk menjalankan perangkat lunak (langsung dari repositori).
Simpan File sebagai 'Default' dan Aktifkan Secara Manual / Otomatis
Jika tidak sepenuhnya tidak dapat diterima untuk terus mempertahankan konten file konfigurasi dalam repositori, Anda mungkin dapat mengubah nama file yang dilacak dari (misalnya) foo.conf
ke foo.conf.default
dan kemudian menginstruksikan pengguna Anda untuk cp foo.conf.default foo.conf
setelah menerapkan komit nama ganti. Atau, jika pengguna sudah menggunakan bagian repositori yang ada (mis. Skrip atau program lain yang dikonfigurasi oleh konten dalam repositori (mis. Makefile
Atau sejenisnya)) untuk meluncurkan / menggunakan perangkat lunak Anda, Anda dapat memasukkan mekanisme default ke dalam peluncuran / proses penyebaran:
test -f foo.conf || test -f foo.conf.default &&
cp foo.conf.default foo.conf
Dengan seperti mekanisme default di tempat, pengguna harus dapat menarik komit yang mengganti nama foo.conf
untuk foo.conf.default
tanpa harus melakukan kerja ekstra. Selain itu, Anda menghindari menyalin file konfigurasi secara manual jika Anda membuat instalasi / repositori tambahan di masa mendatang.
Menulis Ulang Sejarah Membutuhkan Intervensi Manual ...
Jika tidak bisa mempertahankan konten dalam repositori maka Anda mungkin ingin menghapusnya sepenuhnya dari sejarah dengan sesuatu seperti git filter-branch --index-filter …
. Ini berjumlah menulis ulang sejarah, yang akan membutuhkan intervensi manual untuk setiap cabang / repositori (lihat “Memulihkan Dari Hulu Rebase” di bagian git rebase manualnya ). Perlakuan khusus yang diperlukan untuk file konfigurasi Anda hanyalah langkah lain yang harus dilakukan ketika memulihkan dari penulisan ulang:
- Simpan salinan file konfigurasi.
- Pulihkan dari penulisan ulang.
- Pulihkan file konfigurasi.
Abaikan Itu untuk Mencegah Pengulangan
Apapun metode yang Anda gunakan, Anda mungkin ingin memasukkan nama file konfigurasi dalam .gitignore
file di repositori sehingga tidak ada yang dapat secara tidak sengaja git add foo.conf
lagi (mungkin, tetapi membutuhkan -f
/ --force
). Jika Anda memiliki lebih dari satu file konfigurasi, Anda dapat mempertimbangkan 'memindahkan' semuanya ke dalam satu direktori dan mengabaikan semuanya (dengan 'memindahkan' maksud saya mengubah di mana program mengharapkan untuk menemukan file konfigurasinya, dan mendapatkan pengguna (atau peluncuran / mekanisme menyebarkan) untuk menyalin / memindahkan file ke lokasi baru mereka, Anda jelas tidak ingin git mv file ke dalam direktori yang Anda akan mengabaikan).