Як я можу повністю видалити файл зі сховища git?


78

Нещодавно я помітив, що у файли проекту, якими користуються мої текстові редактори (разом з деякими іншими небажаними файлами), додано сховище git для проекту. Оскільки вони насправді не є частиною проекту, я хотів би їх видалити, але git rmне видаляю зі сховища старі версії, і я не міг знайти нічого іншого, що виглядає перспективним.


5
частковий дублікат, безумовно охоплений попередніми питаннями: stackoverflow.com/questions/307828/… stackoverflow.com/questions/1216733/…
Cascabel

Відповіді:


140

Інструмент, який ви хочете, є git filter-branch. Його використання описано тут , але в основному:

$ git filter-branch --tree-filter 'rm -f my_file' HEAD

буде видаляти "my_file" з кожного коміту .

Зверніть увагу, що це переписує кожен коміт, тому, якщо ви натиснете на віддалене сховище, вам доведеться (a) примусити оновлення, і (b) всі інші, хто витягнув з вас, тепер матимуть повторювані коміти (оскільки ви переписали історію), як описано на git rebaseсторінці користувача .


19
Я рекомендую додати, --prune-emptyщоб усі порожні коміти, створені в результаті, також були видалені.
fnkr

Як це працює на сховищі з багатьма файлами з однаковим іменем у різних каталогах? Чи видаляє всі файли з однаковим ім'ям?

2
@CodeMonkey: У такому випадку ви б використали довший, унікальний шлях.
міпаді

1
пізніше мені робити git push --force? @mipadi
alper

1
@mipadi, а що, якби я видалив ці файли локально, давно? (і здійснив та натиснув ці видалення) Як у цьому випадку я можу видалити файли зі сховища?
mannyglover

11

Це те, що git filter-branchпризначене, але будьте обережні, що історія вашого репозиторію зміниться, а хеш комітів буде іншим після перезапису історії.

Якщо ви також хочете звільнити простір, я рекомендую вам використовувати git forget-blob, оскільки git filter-branchсам по собі не змусить git забути ваш файл, оскільки на нього все ще можуть посилатися пульти дистанційного керування, перезапис, теги тощо.

git forget-blob main.c.swp

Ви можете отримати більше інформації тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.