Saat Anda menggunakan
git rm --cached myfile
itu tidak menghapus dari sistem file lokal, yang merupakan tujuannya. Tetapi jika Anda sudah membuat versi dan mengkomit file, mendorongnya ke repositori pusat, dan menariknya ke repositori lain sebelum menggunakan perintah, itu akan menghapus file dari sistem itu.
Apakah ada cara untuk menghapus file dari versi tanpa menghapusnya dari sistem file apa pun?
Sunting: Klarifikasi, saya harap.
git
version-control
gitignore
git-rm
Fletcher Moore
sumber
sumber
Jawaban:
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) ataugit 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 :
Atau dengan git checkout (per komentar oleh William Pursell; tetapi jangan lupa untuk menghapusnya kembali dari indeks!):
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 digunakangit 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
kefoo.conf.default
dan kemudian menginstruksikan pengguna Anda untukcp 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:Dengan seperti mekanisme default di tempat, pengguna harus dapat menarik komit yang mengganti nama
foo.conf
untukfoo.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: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 sengajagit 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).sumber
--{,no-}assume-unchanged
murni lokal: negaranya tidak langsung dicatat dalam commit. Ini dapat membantu mencegah repositori melakukan perubahan baru pada file, tetapi itu tidak menghapusnya dari kontrol versi. Jika Anda dapat mengaturnya untuk semua yang relevan, terkait, repositori non-telanjang, maka dapat membantu situasi Anda, tapi itu bukan sesuatu yang Anda bisa langsung mendorong + tarik / rebase ke terkait, repositori non-telanjang lainnya (terutama yang Anda tidak mengontrol, seperti komentar klarifikasi penanya asli pada pertanyaan: lihat "sistem orang" / "sistem asing").I do not think a Git commit can record an intention like “stop tracking this file, but do not delete it”.
- sekarang bisa, dengangit rm --cached foo.conf
Memiliki masalah yang sama minggu ini ketika saya secara tidak sengaja melakukan, kemudian mencoba untuk menghapus file build dari repositori bersama, dan ini:
http://gitready.com/intermediate/2009/02/18/temporently-ignoring-files.html
telah bekerja dengan baik untuk saya dan tidak disebutkan sejauh ini.
Untuk menghapus file yang Anda minati dari kontrol versi, maka gunakan semua perintah Anda seperti biasa.
Jika Anda ingin memasukkannya kembali.
Sunting: silakan lihat komentar dari Chris Johnsen dan KPM, ini hanya berfungsi secara lokal dan file tetap di bawah kontrol versi untuk pengguna lain jika mereka juga tidak melakukannya. Jawaban yang diterima memberikan metode yang lebih lengkap / benar untuk menangani ini. Juga beberapa catatan dari tautan jika menggunakan metode ini:
sumber
Untuk menghapus file dari indeks, gunakan:
Ini seharusnya tidak mempengaruhi salinan lokal Anda atau milik orang lain.
sumber
reset
hanya menghapus file dari indeks jika file tersebut tidak ada dalam komit KEPALA saat ini, jika tidak hanya mengembalikan versi indeks ke versi HEAD saat ini.git rm --cached remove_file
git add .gitignore
git commit -m "Excluding"
sumber
Setelah melakukan
git rm --cached
perintah, coba tambahkanmyfile
ke.gitignore
file (buat satu jika tidak ada). Ini seharusnya memberitahu git untuk mengabaikannyamyfile
.The
.gitignore
file berversi, sehingga Anda akan perlu untuk melakukan itu dan mendorongnya ke repositori jauh.sumber
Solusi saya adalah menarik copy pekerjaan lain dan kemudian lakukan:
yang mengatakan dapatkan semua jalur file di komentar terbaru, dan periksa dari induk HEAD. Pekerjaan selesai.
sumber
Solusi di atas berfungsi dengan baik untuk sebagian besar kasus. Namun, jika Anda juga perlu menghapus semua jejak file itu (yaitu data sensitif seperti kata sandi), Anda juga ingin menghapusnya dari seluruh riwayat komit Anda, karena file tersebut masih dapat diambil dari sana.
Berikut adalah solusi yang menghapus semua jejak file dari seluruh riwayat komit Anda, seolah-olah tidak pernah ada, namun tetap menyimpan file di sistem Anda.
https://help.github.com/articles/remove-sensitive-data/
Anda sebenarnya dapat melompat ke langkah 3 jika Anda berada di repositori git lokal Anda, dan tidak perlu melakukan dry run. Dalam kasus saya, saya hanya perlu langkah 3 dan 6, karena saya sudah membuat file .gitignore saya, dan berada di repositori yang ingin saya kerjakan.
Untuk melihat perubahan Anda, Anda mungkin perlu pergi ke root GitHub dari repositori Anda dan menyegarkan halaman. Kemudian navigasikan melalui tautan untuk mendapatkan komit lama yang pernah memiliki file, untuk melihat bahwa itu sekarang telah dihapus. Bagi saya, hanya menyegarkan halaman komit lama tidak menunjukkan perubahan.
Itu tampak menakutkan pada awalnya, tapi sungguh, itu mudah dan bekerja seperti pesona! :-)
sumber