Удалите старые данные фиксации из репозитория git, чтобы сэкономить место

У меня есть хранилище для хранения больших двоичных файлов (tifs, jpgs, pdfs), которые становятся довольно крупными. Существует также большое количество файлов, которые создаются, удаляются и переименовываются, и мне не нужна отдельная история фиксации. Этот вопрос несколько упрощен, потому что я имею дело с репозиторием, у которого нет ветвей и нет тегов.

Мне любопытно, есть ли простой способ удалить часть истории из системы, чтобы сэкономить место.

Я нашел старую нить в списке рассылки git, но в ней не указано, как ее использовать (то есть, что такое $drop):

git filter-branch --parent-filter "sed -e 's/-p $drop//'" \
        --tag-name-filter cat -- \
        --all ^$drop 

Ответ 1

Я думаю, вы можете уменьшить свою историю после этого ответа:

Как удалить конкретную ревизию github gist?

Определите, в каких точках истории вы хотите сохранить.

pick <hash1> <commit message>
pick <hash2> <commit message>
pick <hash3> <commit message>   <- keep
pick <hash4> <commit message>
pick <hash5> <commit message>
pick <hash6> <commit message>   <- keep
pick <hash7> <commit message>
pick <hash8> <commit message>
pick <hash9> <commit message>
pick <hash10> <commit message>  <- keep

Затем оставьте первый после каждого "держать" как "выбрать" и отметьте остальных как "сквош".

pick   <hash1> <commit message>
squash <hash2> <commit message>
squash <hash3> <commit message>   <- keep
pick   <hash4> <commit message>
squash <hash5> <commit message>
squash <hash6> <commit message>   <- keep
pick   <hash7> <commit message>
squash <hash8> <commit message>
squash <hash9> <commit message>
squash <hash10> <commit message>  <- keep

Затем запустите rebase, сохранив и покинув редактор. В каждой точке "сохранить" редактор сообщений будет всплывать для комбинированного сообщения фиксации, начиная с предыдущего "выбора" и заканчивая фиксацией "сохранить". Вы можете либо просто сохранить последнее сообщение, либо на самом деле объединить их для документирования исходной истории, не сохраняя все промежуточные состояния.

После этого rebase промежуточные данные файла будут по-прежнему находиться в репозитории, но теперь не отображаются. git gc теперь действительно избавит вас от этих данных.

Ответ 2

Вы всегда можете просто удалить .git и сделать новый git init с одним начальным коммитом. Это, конечно, удалит всю историю коммитов.

Ответ 3

$drop - это переменная (которую вы хотите найти)

Если вы хотите очистить ненужные файлы и оптимизировать локальный репозиторий, вы должны проверить команду git gc

И git prune - еще один вариант, поскольку он удаляет объекты, которые больше не указываются ни одним объектом в любой доступной ветке.

Надеюсь, это поможет вам.

Ответ 4

Если вы хотите найти и удалить большие файлы из истории Git, Pro Git имеет раздел Удаление объектов, который поможет вам в этом процессе. Это немного сложно, но это позволит вам удалить файлы из вашей истории, которые вы удалили в любом случае, оставив всю оставшуюся историю неповрежденной.

Ответ 5

Немного сложно забыть о файле git о файле.

git rm только удалит файл с этой ветки с этого момента, но он останется в истории, а git запомнит его.

Правильный способ сделать это с помощью git filter-branch, как упоминали другие. Он будет переписывать каждую фиксацию в истории ветки для удаления этого файла.

Но даже после этого git может запомнить его, потому что в нем могут быть ссылки на reflog, remotes, теги и т.д.

Я написал небольшую утилиту под названием git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

Это просто, просто git forget-blob file1.txt.

Это приведет к удалению всех ссылок, сделайте git filter-branch и, наконец, запустите сборщик мусора git git gc, чтобы полностью избавиться от этого файла в вашем репо.