Большие файлы, застрявшие в кэше git [duplicate]

Попробуйте использовать .live() вместо .bind(); .live() свяжет .hover с вашим флажком после выполнения запроса Ajax.

511
задан Whymarrh 16 April 2017 в 03:39
поделиться

15 ответов

Используйте BFG Repo-Cleaner , более быструю и быструю альтернативу git-filter-branch, специально разработанную для удаления нежелательных файлов из истории Git.

Аккуратно следуйте за использованием команды , основная часть - это:

$ java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git

Любые файлы размером более 100 МБ (которые не входят в ваш последний коммит ) будут удалены из вашей истории хранилища Git. Затем вы можете использовать git gc для очистки мертвых данных:

$ git gc --prune=now --aggressive

BFG обычно не менее 10-50x быстрее, чем работает git-filter-branch, и, как правило, для использования.

Полное раскрытие: я являюсь автором BFG Repo-Cleaner.

420
ответ дан 030 18 August 2018 в 09:37
поделиться
  • 1
    @ tony Стоит повторить все клонирование & amp; чтобы узнать, не вызвало ли сообщение сообщение о повторном появлении, но это почти наверняка, потому что ваш удаленный сервер настроен на отказ от обновлений без пересылки (т. е. он настроен на то, чтобы остановить вас от потери истории), что и есть то, что вы хотеть сделать). Вам нужно, чтобы этот параметр изменился на удаленном компьютере, или, если это не удалось, переместите обновленную историю репо на совершенно новый пустой репо. – Roberto Tyley 24 February 2014 в 01:09
  • 2
    @RobertoTyley Спасибо. Я пробовал это 3 раза, и все это привело к тому же сообщению. Поэтому я также думаю, что вы правы в том, что удаленный сервер настроен на отказ от обновлений без пересылки. Я рассмотрю, как просто нажать обновленное репо на новый репо. Спасибо! – Tony 24 February 2014 в 01:30
  • 3
    @RobertoTyley Отлично, вы сэкономите свое время, спасибо большое. Кстати, возможно, после выполнения шагов вы должны сделать git push --force, иначе удаленное репо все еще не изменилось. – li2 22 July 2015 в 16:16
  • 4
    +1 к добавлению git push --force. Также стоит отметить: принудительные нажатия не могут быть разрешены пультом дистанционного управления (по умолчанию gitlab.com этого не делает. Пришлось «отменить защиту» от ветви). – MatrixManAtYrService 10 September 2015 в 15:51
  • 5
    Я думаю, что Trump jargon выводит инструмент немного. – Chris 25 April 2018 в 18:39

git filter-branch --tree-filter 'rm -f path/to/file' HEAD работал очень хорошо для меня, хотя я столкнулся с той же проблемой, что описал здесь здесь , которую я решил, выполнив это предложение .

В книге pro-git есть целая глава в истории перезаписи - посмотрите раздел filter-branch / Удаление файла из раздела Every Commit .

472
ответ дан Community 18 August 2018 в 09:37
поделиться
  • 1
    Почему я не могу нажать, когда вы используете git filter-branch, не удалось нажать некоторые ссылки на «git@bitbucket.org: product / myproject.git». Чтобы предотвратить потерю истории, были отменены немедленные обновления. Объединение удаленного изменения перед повторным нажатием. – Agung Prasetyo 4 February 2013 в 12:49
  • 2
    Добавьте параметр -f (или --force) к вашей команде git push: «Обычно команда отказывается обновлять удаленный реф, который не является предком локального ref, используемого для его перезаписывания. Этот флаг отключает проверку. Это может привести к тому, что удаленный репозиторий потеряет фиксации; используйте его с осторожностью ». – Greg Bacon 5 February 2013 в 01:47
  • 3
    Это замечательный ответ, объясняющий использование ветки git-filter для удаления ненужных больших файлов из истории, но стоит отметить, что после того, как Грег написал свой ответ, выпущен BFG Repo-Cleaner, который часто быстрее и проще используйте - см. мой ответ для деталей. – Roberto Tyley 15 January 2014 в 17:09
  • 4
    После того, как я сделаю одну из описанных выше процедур, удаленный репозиторий (на GitHub) НЕ удаляет большой файл. Только местный делает. Я заставляю толчок и нада. Что мне не хватает? – toszter 13 May 2014 в 22:11
  • 5
    это также работает на dirs. ... "git rm --cached -rf --ignore-unmatch path/to/dir"... – rynop 20 August 2014 в 17:08

Я в основном сделал то, что было в этом ответе: https://stackoverflow.com/a/11032521/1286423

(для истории я скопирую его здесь)

$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch YOURFILENAME" HEAD
$ rm -rf .git/refs/original/ 
$ git reflog expire --all 
$ git gc --aggressive --prune
$ git push origin master --force

Это не сработало, потому что мне очень нравится переименовывать и перемещать вещи. Поэтому некоторые большие файлы были в папках, которые были переименованы, и я думаю, что gc не смог удалить ссылку на эти файлы из-за ссылки в tree объектах, указывающих на эти файлы. Моим окончательным решением действительно убить это было:

# First, apply what's in the answer linked in the front
# and before doing the gc --prune --aggressive, do:

# Go back at the origin of the repository
git checkout -b newinit <sha1 of first commit>
# Create a parallel initial commit
git commit --amend
# go back on the master branch that has big file
# still referenced in history, even though 
# we thought we removed them.
git checkout master
# rebase on the newinit created earlier. By reapply patches,
# it will really forget about the references to hidden big files.
git rebase newinit

# Do the previous part (checkout + rebase) for each branch
# still connected to the original initial commit, 
# so we remove all the references.

# Remove the .git/logs folder, also containing references
# to commits that could make git gc not remove them.
rm -rf .git/logs/

# Then you can do a garbage collection,
# and the hidden files really will get gc'ed
git gc --prune --aggressive

Мое репо (.git) изменилось с 32 МБ на 388 КБ, что даже ветвь фильтра не могла очистить.

1
ответ дан Dolanor 18 August 2018 в 09:37
поделиться

Вы можете сделать это, используя команду branch filter:

git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD

3
ответ дан John Foley 18 August 2018 в 09:37
поделиться

Попробовав практически каждый ответ в SO, я наконец нашел этот камень, который быстро удалил и удалил большие файлы в моем репозитории и разрешил мне снова синхронизировать: http://www.zyxware.com/articles/4027 / how-to-delete-files-постоянно-from-your-local-and-remote-git-repositories

CD в локальную рабочую папку и выполните следующую команду:

git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch FOLDERNAME" -- --all

заменить FOLDERNAME файлом или папкой, которую вы хотите удалить из данного репозитория git.

После этого выполните следующие команды для очистки локального репозитория:

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

Теперь нажмите все изменения в удаленном репозитории:

git push --all --force

Это очистит удаленный репозиторий.

17
ответ дан Justin 18 August 2018 в 09:37
поделиться
  • 1
    Работала для меня как шарм. – Ramon Vasconcelos 16 April 2018 в 07:17
  • 2
    Это сработало и для меня. Получает избавление от определенной папки (в моем случае, содержащей слишком большие файлы или репозитории Github) в хранилище, но сохраняет ее в локальной файловой системе в случае ее существования. – skizzo 8 July 2018 в 12:13

Эти команды работали в моем случае:

git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch oops.iso' --prune-empty --tag-name-filter cat -- --all
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

Это немного отличается от указанных выше версий.

Для тех, кому нужно нажать это на github / bitbucket (только я испытал это с битбакетом):

# WARNING!!!
# this will rewrite completely your bitbucket refs
# will delete all branches that you didn't have in your local

git push --all --prune --force

# Once you pushed, all your teammates need to clone repository again
# git pull will not work
27
ответ дан Kostanos 18 August 2018 в 09:37
поделиться
  • 1
    Чем это отличается от того, почему это лучше? – Andy Hayden 14 June 2013 в 10:08
  • 2
    По какой-то причине версия mkljun не уменьшает пространство git в моем случае, я уже удалил файлы из индекса с помощью git rm --cached files. Предложение Грега Бэкона более полно и совершенно одинаково для этой шахты, но он пропустил индекс -force для случаев, когда вы используете фильтр-ветвь в течение нескольких раз, и он написал так много информации, что моя версия похожа на резюме из этого. – Kostanos 14 June 2013 в 15:09
  • 3
    Это действительно помогло, но мне нужно было использовать опцию -f не только -rf здесь git rm --cached -rf --ignore-unmatch oops.iso, а git rm --cached -r --ignore-unmatch oops.iso в соответствии с @ lfender6445 ниже – drstevok 21 October 2016 в 06:18

Я столкнулся с этим с учетной записью bitbucket, где я случайно сохранил ginormous * .jpa резервные копии моего сайта.

git filter-branch --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch MY-BIG-DIRECTORY-OR-FILE' --tag-name-filter cat -- --all

Переместить MY-BIG-DIRECTORY с соответствующей папкой, чтобы полностью переписать вашу историю (, включая теги ).

Источник

: http://naleid.com/blog/2012/01/17/finding-and-purging-big-files-from-git-history

5
ответ дан lfender6445 18 August 2018 в 09:37
поделиться
  • 1
    Этот ответ помог мне, за исключением того, что сценарий в ответе имеет небольшую проблему, и он не ищет во всех ветвях меня. Но команда в ссылке сделала это отлично. – Ali B 5 September 2015 в 20:20

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

Чтобы все ухудшилось, перезагрузка тоже нелегкая, потому что любые ссылки на blob предотвратят сборщик мусора git от очистки пространства. Это включает в себя удаленные ссылки и ссылки reflog.

Я собрал git forget-blob, маленький скрипт, который пытается удалить все эти ссылки, а затем использует git filter-branch для перезаписи каждой фиксации в ветке.

Как только ваш blob полностью не найден, git gc избавится от него

. Использование довольно просто git forget-blob file-to-forget. Вы можете получить дополнительную информацию здесь

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

Я собрал это вместе благодаря ответам из Stack Overflow и некоторым блогам. Кредиты к ним!

1
ответ дан nachoparker 18 August 2018 в 09:37
поделиться

Используйте Git Extensions , это инструмент пользовательского интерфейса.

Не используйте «git filter-branch» перед использованием этого инструмента, так как он не будет использоваться для добавления файлов в хранилищах в файлах хранилища в репозиториях. способный находить файлы, удаленные с помощью «filter-branch» (Altough «filter-branch» не полностью удаляет файлы из файлов пакета репозитория).

1
ответ дан Nir 18 August 2018 в 09:37
поделиться
  • 1
    Этот метод слишком медленный для больших репозиториев. Чтобы перечислить большие файлы, потребовалось более часа. Затем, когда я иду на удаление файлов, через час это всего лишь 1/3 пути обработки первого файла, который я хочу удалить. – kristianp 4 October 2017 в 04:19
  • 2
    Да, это медленно, но делает работу ... Знаете ли вы что-нибудь быстрее? – Nir 6 October 2017 в 21:03
  • 3
    Не использовали его, но BFG Repo-Cleaner, согласно другому ответу на этой странице. – kristianp 9 October 2017 в 04:42

Просто обратите внимание, что эти команды могут быть очень разрушительными. Если на репо будет работать больше людей, все они должны будут вытащить новое дерево. Три средних команды не нужны, если ваша цель НЕ уменьшить размер. Поскольку ветвь фильтра создает резервную копию удаленного файла и может оставаться там в течение длительного времени.

$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch YOURFILENAME" HEAD
$ rm -rf .git/refs/original/ 
$ git reflog expire --all 
$ git gc --aggressive --prune
$ git push origin master --force
8
ответ дан om-nom-nom 18 August 2018 в 09:37
поделиться
  • 1
    НЕ запускайте эти команды, если вы не хотите создать огромную боль для себя. Он удалил много моих исходных файлов исходного кода. Я предположил, что он очистит некоторые большие файлы из моей истории транзакций в GIT (в соответствии с исходным вопросом), однако я думаю, что эта команда предназначена для постоянной очистки файлов из исходного дерева исходного кода (большая разница!). Моя система: Windows, VS2012, поставщик контроля источника Git. – Contango 22 October 2012 в 12:16
  • 2
    Я использовал эту команду: git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch oops.iso' --prune-empty --tag-name-filter cat -- --all вместо первой из вашего кода – Kostanos 14 June 2013 в 03:31

Если вы знаете, что ваша фиксация была последней, а не через все дерево, сделайте следующее: git filter-branch --tree-filter 'rm LARGE_FILE.zip' HEAD~10..HEAD

7
ответ дан Soheil 18 August 2018 в 09:37
поделиться

(Лучший ответ, который я видел в этой проблеме: https://stackoverflow.com/a/42544963/714112 , скопирован здесь, так как этот поток выглядит высоко в ранжировании поиска Google, но это другой нет)

17
ответ дан Sridhar-Sarnobat 18 August 2018 в 09:37
поделиться
  • 1
    Если у вашего репо есть теги, вы, вероятно, также захотите добавить флаг --tag-name-filter cat для повторной маркировки новых соответствующих коммитов по мере их перезаписи, т. Е. git filter-branch --index-filter 'git rm --cached --ignore-unmatch a b' --tag-name-filter cat HEAD (см. этот связанный ответ ) – naitsirhc 8 February 2018 в 04:25
  • 2
    Инструкции Mac и другая информация появляются в исходном связанном сообщении – nruth 5 March 2018 в 19:55
  • 3
    git filter-branch --index-filter 'git rm --cached --ignore-unmatch <filename>' HEAD правообладатель – eleijonmarck 5 April 2018 в 06:00

Почему бы не использовать эту простую, но мощную команду?

git filter-branch --tree-filter 'rm -f DVD-rip' HEAD

Параметр --tree-filter запускает указанную команду после каждой проверки проекта и затем подтверждает результаты. В этом случае вы удаляете файл с именем DVD-rip из каждого моментального снимка, независимо от того, существует он или нет.

См. эту ссылку .

112
ответ дан Tse Kit Yam 18 August 2018 в 09:37
поделиться
  • 1
    Это хорошее решение! Я создал сущность, которая имеет скрипт python для перечисления файлов & amp; git cmd, который удалит файл, который вы хотите очистить gist.github.com/ariv3ra/16fd94e46345e62cfcbf – A. Rivera 27 January 2016 в 00:16
  • 2
    Гораздо лучше, чем bfg. Мне не удалось очистить файл от git с помощью bfg, но эта команда помогла – podarok 1 July 2016 в 11:56
  • 3
    Отлично. Просто обратите внимание на то, что вам нужно сделать это для каждой ветки, если большой файл находится в нескольких ветвях. – James 19 August 2016 в 01:38
  • 4
    В Windows я получил fatal: bad revision 'rm', который я исправил с помощью " вместо '. Общая команда: git filter-branch --force --index-filter "git rm --cached -r --ignore-unmatch oops.iso" --prune-empty --tag-name-filter cat -- --all – marcotama 4 October 2016 в 06:02
  • 5
    Кроме того, моя команда не работала при использовании \ в качестве разделителя путей - даже в Windows. Мне пришлось использовать /. – marcotama 4 October 2016 в 06:17
475
ответ дан Community 6 September 2018 в 22:14
поделиться
484
ответ дан Community 30 October 2018 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: