.gitignore setelah komit

210

Saya memiliki repositori git yang di-host di Github. Setelah melakukan banyak file, saya menyadari bahwa saya harus membuat .gitignoredan belum termasuk .exe, .objfile.

Namun, apakah ini akan secara otomatis menghapus file-file ini dari repositori? Apakah ada cara untuk memaksanya?

Madhur Ahuja
sumber
6
Googler di masa depan mungkin menganggap ini sangat berguna. Ringkas dan to the point: git-tower.com/learn/git/faq/ignore-tracked-files-in-git
Austin Dean

Jawaban:

331

Tidak, Anda tidak dapat memaksa file yang sudah dikomit dalam repo untuk dihapus hanya karena ditambahkan ke .gitignore

Anda harus git rm --cachedmenghapus file yang tidak Anda inginkan dalam repo. (--cached karena Anda mungkin ingin menyimpan salinan lokal tetapi menghapus dari repo.) Jadi jika Anda ingin menghapus semua exe dari repo Anda lakukan

git rm --cached /\*.exe

(Perhatikan bahwa tanda bintang * dikutip dari shell - ini memungkinkan git, dan bukan shell, perluas nama path file dan subdirektori)

manojlds
sumber
6
@ Madhur Ahuja Sebenarnya jika Anda melakukannya git rm /\*.exeakan menghapus semua exe di repo Anda
manojlds
4
Untuk apa /?
Costa
5
@Costa mereka ada di sana untuk menghindari asterisk, untuk mencegah shell mengartikannya, seperti yang dimaksudkan git.
Lambart
2
Peringatan: File disimpan di lokal, itu benar ... Tapi pengguna lain yang menjalankan git pullakan melihat file mereka dihapus.
ByScripts
42

Namun, apakah ini akan secara otomatis menghapus file-file ini dari repositori?

Tidak. Bahkan dengan yang sudah ada, .gitignoreAnda dapat mengatur file "diabaikan" dengan -fbendera (paksa). Jika file mereka sudah dikomit, mereka tidak bisa dihapus secara otomatis.

git rm --cached path/to/ignored.exe
KingCrunch
sumber
Apakah itu berarti saya telah menghapus masing-masing .exe
Madhur Ahuja
Anda mungkin dapat
mengelompokkan
30

Jika Anda belum mendorong perubahan:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push
slal
sumber
15

Saya harus menghapus .idea dan folder target dan setelah membaca semua komentar ini berhasil bagi saya:

git rm -r .idea
git rm -r target
git commit -m 'removed .idea folder'

dan kemudian dorong untuk menguasai

Emanuele
sumber
.ideaadalah masalah saya, saya kira itu juga milik Anda:)
Olivier Pons
5

Namun, apakah ini akan secara otomatis menghapus file-file ini dari repositori?

Tidak.

Resep 'terbaik' untuk melakukan ini adalah menggunakan git filter-branchseperti yang tertulis di sini:

Halaman manual untuk git-filter-branch berisi contoh komprehensif.

Catatan Anda akan menulis ulang riwayat. Jika Anda telah menerbitkan revisi apa pun yang berisi file yang ditambahkan secara tidak sengaja, ini dapat membuat masalah bagi pengguna cabang publik tersebut. Beri tahu mereka, atau mungkin pikirkan seberapa buruk Anda perlu menghapus file.

Catatan Di hadapan tag, selalu gunakan --tag-name-filter catopsi untuk git filter-branch. Tidak pernah sakit dan akan menyelamatkan Anda dari sakit kepala ketika Anda menyadari nanti bahwa Anda membutuhkannya

lihat
sumber
Saya menjalankan perintah ini yang menunjukkan Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) PERINGATAN: Ref 'ref / heads / master' tidak berubah dan tidak ada yang terjadi
Madhur Ahuja
Ini adalah peringatan, dan kemungkinan besar berarti bahwa cabang master belum (belum) memuat revisi apa pun dengan file yang akan dihapus. Anda dapat dengan mudah memeriksanya. Jika ada masalah, harap perbarui pertanyaan. PS: gunakan - --alluntuk menulis ulang semua cabang (lokal) sekaligus
sehe
1

Bahkan setelah Anda menghapus file dan kemudian melakukan, Anda masih akan memiliki file-file itu dalam sejarah. Untuk menghapusnya, pertimbangkan menggunakan BFG Repo-Cleaner . Ini adalah alternatif untuk git-filter-branch.

Abu
sumber