Ответ 1
Отметьте https://help.github.com/articles/remove-sensitive-data. Здесь они пишут об удалении конфиденциальных данных из вашего репозитория Git, но вы можете очень хорошо использовать его для удаления больших файлов из ваших коммитов.
Мы запускаем центральный репозиторий git (gforge), который каждый извлекает и толкает. К сожалению, некоторые неумелые коллеги решили, что толчок нескольких файлов размером 10-100 МБ в репо был хорошей идеей. Вследствие этого на нашем сервере, который мы используем много, закончилось дисковое пространство.
Мы только осознали это, когда было слишком поздно, и большинство людей вытащили новое огромное репо. Если бы проблема не была нажата, тогда мы могли бы просто сделать rebase, чтобы вырезать эти огромные коммиты и исправить ее, но теперь все вытащили из нее, что лучший способ удалить эту фиксацию (или сделать перестановку просто удалите большие файлы), а затем это не вызовет хаос, когда каждый хочет вытащить/нажать из/в репо?
Он должен быть небольшим репо для скриптов, но теперь он имеет размер около 700 М: - (
Отметьте https://help.github.com/articles/remove-sensitive-data. Здесь они пишут об удалении конфиденциальных данных из вашего репозитория Git, но вы можете очень хорошо использовать его для удаления больших файлов из ваших коммитов.
Самый простой способ избежать хаоса - предоставить серверу больше диска.
Это непросто. Для удаления файлов требуется также удалить их из истории, которая может быть выполнена только с помощью git filter-branch
. Эта команда, например, удалит <file>
из истории:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <file>' \
--prune-empty --tag-name-filter cat -- --all
Проблема заключается в том, что это перезаписывает хэши SHA1, что означает, что всем в команде понадобится reset к новой версии ветки или рискует серьезной головной болью. Это все хорошо и хорошо, если никто не работает, и вы все используете ветки темы. Если вы более централизованы, ваша команда большая, или многие из них хранят грязные рабочие каталоги, пока они работают, нет никакого способа сделать это без немного хаоса и раздора. Вы могли потратить довольно много времени, чтобы все локальные работали правильно. То, что написано, git filter-branch
, вероятно, лучшее решение. Просто убедитесь, что у вас есть план, ваша команда это понимает, и вы убедитесь, что они создают резервные копии своих локальных хранилищ на случай, если какая-то важная работа будет потеряна или запущена.
Один из возможных вариантов:
git diff > ~/my_wip
.git format-patch <branch>
git filter-branch
. Удостоверьтесь, что команда знает, что не тянет, пока это происходит.git fetch && git reset --hard origin/<branch>
или попросите их повторно клонировать репозиторий.git am <patch>
.git apply
, например. git apply ~/my_wip
.В дополнение к другим ответам, вы можете захотеть добавить некоторую предохраняющую защиту от будущих гигантских файлов jar в форме предварительного приема в репо, который запрещает пользователям (или, по крайней мере, "не-админ" пользователи ") от нажатия очень больших файлов или файлов с именем *.jar
или что-то вроде лучшего.
Ранее мы делали такие вещи, в том числе запрещали определенные идентификаторы фиксации из-за определенных пользователей, которые просто не могли получить зависание "сохранить вашу работу в ветке temp, reset и потянуть, и повторно применить ваша работа, минус гигантский файл".
Обратите внимание, что крюк pre-receive работает в довольно интересном контексте: файлы фактически загружены, а именно, что ссылки (обычно ветки ветки) еще не изменились. Вы можете предотвратить изменение заголовков ветвей, но вы все равно будете использовать (временное, до gc'ed) дисковое пространство и пропускную способность сети.
Использовать ветвь фильтра!
git filter-branch --tree-filter 'find . -name "*.jar" -exec rm {} \;'
Затем просто очистите все коммиты, у которых нет файлов в них:
git filter-branch -f --prune-empty -- --all
Парень GForge здесь. Даже подумал, что это прежде всего вопрос git, я бы хотел предложить две вещи: