Pertanyaan Benar-benar menghapus file dari Git repo dan remote pada GitHub


Saya tidak sengaja menambahkan folder gambar dan berkomitmen. Kemudian, saya membuat satu komitmen lagi. Lalu saya menghapus file-file itu git rm -f ./images dan berkomitmen lagi.

Saat ini, saya telah membuat lebih banyak komitmen di cabang itu (master). Di HEAD saya, saya tidak memilikinya ./static/images map.

Karena ini, ukuran repo saya telah meningkat banyak. Bagaimana cara menghapus gumpalan itu sepenuhnya? Dan saya ingin menghapusnya dari reparasi GitHub jarak jauh saya juga.


76
2018-04-06 08:36


asal


Jawaban:


Ini yang Anda cari: mengabaikan tidak menghapus file. Saya sarankan Anda membaca halaman itu, tapi inilah perintah khusus untuk digunakan:

git filter-branch --index-filter \
'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

Juga, untuk menghapus semua file yang dihapus dari cache yang dibuat git, gunakan:

rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune

Anda dapat menemukan info lebih lanjut tentang perintah terakhir, serta skrip yang melakukan semua yang Anda inginkan dalam satu tindakan tunggal, di sini: git: selamanya hapus file atau folder dari riwayat.

Tautan lain dengan banyak penjelasan: Hapus data sensitif.

[Sunting] Juga, lihat pertanyaan StackOverflow ini: Hapus file sensitif dan komitmennya dari riwayat Git.

(Perintah disalin dari natacadoJawabannya ada dalam pertanyaan terkait di atas.) Jika Anda sudah menghapus file dari copy pekerjaan, berikut ini harusnya berfungsi. Cari tahu hash untuk komit yang menambahkan file yang tidak diinginkan. Kemudian lakukan:

git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force

124
2018-04-06 08:39



Anda bisa saja me-rebase seluruh cabang Anda dan menghapus kedua commit yang menambahkan gambar dan commit yang menghapusnya.

git rebase -i master

Anda akan disajikan dengan daftar commit. Hapus baris yang memiliki perintah jahat yang ingin Anda hapus. ("dd" menghapus baris di vim, editor default. Lalu simpan dengan ZZ)

Komitmen menggantung kemudian akan dibersihkan dalam proses pengumpulan sampah git alam, sebuah proses yang dapat Anda paksakan dengan perintah yang diberikan dalam jawaban Darhuuk.

Edit: Ini akan berfungsi bahkan jika Anda telah mendorong ke repositori jarak jauh, tetapi Anda harus mendorong dengan --force. (Hal yang sama berlaku untuk solusi git filter-cabang).

Perhatikan bahwa ini akan sangat mengganggu siapa pun yang telah menarik dari cabang Anda. Mereka harus berkonsultasi "Sembuh dari rebase hulu".


Agaknya, penambahan gambar Anda yang tidak disengaja adalah bagian dari komitmen yang ingin Anda simpan. Dalam hal ini, Anda perlu mengedit commit selama rebase untuk memisahkan bagian yang ingin Anda simpan. Anda dapat melakukan ini dengan mengganti "pick" dalam daftar "rebase -i" untuk yang berkomitmen dengan "e" (untuk mengedit). Proses rebase akan berhenti di sini dan Anda dapat membagi commit dengan "git commit --amend".


9
2018-04-06 11:17



Saya pada dasarnya mengulang jawabannya dikombinasikan dengan ini Peringatan format Windows, hanya agar tidak hilang sebagai komentar.

Perhatikan penggunaan tanda kutip ganda daripada tanda kutip tunggal, karena itu tergantung pada shell yang Anda gunakan bagaimana string diurai.

Garis tunggal:

git filter-branch --index-filter "git rm -r --cached --ignore-unmatch <file/dir>" HEAD

Beberapa Baris:

git filter-branch --index-filter \
    "git rm -r --cached --ignore-unmatch <file/dir>" HEAD

3
2017-10-03 14:03