Удалить каталог навсегда из git - PullRequest
48 голосов
/ 01 августа 2009

В моем личном репозитории git у меня есть каталог, содержащий тысячи маленьких изображений, которые больше не нужны. Есть ли способ удалить их из всей истории git? Я пытался

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch imgs" HEAD

и

git filter-branch --tree-filter 'rm -fr imgs' HEAD

но размер git-репо остается неизменным. Есть идеи?

Спасибо

Ответы [ 6 ]

32 голосов
/ 01 августа 2009

В книге ProGit есть интересный раздел Удаление объекта .

Это заканчивается этим:

Ваша история больше не содержит ссылку на этот файл.
Тем не менее, ваш reflog и новый набор ссылок, которые Git добавил, когда вы сделали filter-branch в .git/refs/original, все еще действуют, поэтому вы должны удалить их и затем упаковать базу данных. Вам нужно избавиться от всего, что имеет указатель на эти старые коммиты, перед тем как перепаковать:

$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/
$ git gc
$ git prune --expire 

(git prune --expire не является обязательным, но может удалить содержимое каталога из незакрепленных объектов)
Сделайте резервную копию всего перед выполнением этих команд, на всякий случай;)

14 голосов
/ 04 августа 2009

На самом деле ни один из этих методов не работал для меня. Я обнаружил, что самым надежным было просто потянуть локально в другой репо:

git pull file://$(pwd)/myGitRepo

Это также избавляет вас от необходимости удалять старые теги.

см. Историю в моем блоге: http://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/

13 голосов
/ 01 августа 2009

git-filter-branch по умолчанию сохраняет старые ссылки в refs/original/* пространстве имен.

Вам нужно удалить их, а затем сделать git gc --prune=now

10 голосов
/ 13 июля 2011

Брэндон Томсон спросил в комментарии к решению Rainer Blome , если это просто исправило представление gitk или если ссылки действительно исчезнут. Хороший способ проверить это - вспомнить один из хэшей sha1 (или его уникальный префикс) старых коммитов и попробовать

$ git ls-tree hash-value

Это должно показать вам содержимое основной папки репозитория, как это было в этом коммите. После

$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/

как показано VonC и удаление линий refs/original/… из .git/info/refs и .git/packed-refs, как показано Rainer Blome , окончательный

$ git gc --prune=now

убрал не только ссылки, но и старые объекты (коммиты, деревья и капли). Показанное выше git ls-tree hash-value доказывает это. Еще одна приятная команда для проверки этого - git count-objects -v (запустите ее перед фильтром-брахом и после обрезки и сравните размер).

Примечание: Поскольку мне пока не разрешено комментировать другие ответы, мне пришлось написать новый, хотя в основном он объединяет предыдущие ответы.

3 голосов
/ 03 октября 2009

Если вы хотите пойти по пути ручной очистки, есть еще несколько файлов, которые также могут содержать ссылка на позицию вашей исходной ветки перед веткой git-filter. Например, я отфильтровал свою «домашнюю» ветку:

.git / info / refs:

179ad3e725816234a7182476825862e28752746d ссылки / оригинал / ссылки / головы / home

.git / pack-refs:

179ad3e725816234a7182476825862e28752746d ссылки / оригинал / ссылки / головы / home

После того, как я удалил эти строки, gitk больше не показывал старые коммиты.

2 голосов
/ 02 сентября 2014

Поскольку это старый вопрос, возможно, что-то из этого не было возможно в то время. Это также предполагает, что вы используете bash или cygwin.

Предупреждение: Вторая и третья строки будут безвозвратно удалять все коммиты, недоступные из ваших веток / тегов.

После запуска filter-branch, сделайте

for ref in $(git for-each-ref --format='%(refname)' refs/original); do git update-ref -d $ref; done
git reflog expire --expire=now --all
git gc --prune=now

git for-each-ref --format='%(refname)' получает имена ссылок, а git update-ref -d удаляет ссылки. Как правило, лучше не изменять папку .git напрямую, и, в частности, эта команда обрабатывает случай, когда ссылки находятся в packed-refs.

Вторая и третья строки взяты непосредственно из Как очистить неиспользуемые боковые ветви в ваших деревьях коммитов? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...