У нас есть несколько репозиториев git
, которые выросли до неуправляемого размера из-за исторического включения двоичных тестовых файлов и java .jar
файлов.
Мы собираемся пройти через git filter-branch
в этих репозиториях, повторно клонируя их везде, где они используются (от десятков до сотен развертываний каждый, в зависимости от репо) и с учетом проблемы с переписыванием истории Мне было интересно, могут ли быть какие-либо другие решения.
В идеале я хотел бы экрнализировать файлы проблем без перезаписи истории каждого репозитория. Теоретически это должно быть возможно, потому что вы проверяете те же файлы с одинаковыми размерами и теми же хэшами, просто используя их из другого места (удаленный, а не локальный магазин объектов). Увы, ни одно из потенциальных решений, которые я нашел, пока что не позволяет мне это сделать.
Начиная с git-annex, наиболее близким к решению моей проблемы было Как ретроактивно добавлять файл уже в репозиторий git, но, как и при удалении больших файлов, для этого требуется переписать историю, чтобы преобразовать исходный git add
в git annex add
.
Перейдя оттуда, я начал смотреть на другие проекты, перечисленные в что git -annex не, поэтому я рассмотрел git-bigfiles, git-media и git-fat. К сожалению, мы не можем использовать git -bigfiles fork git
, так как мы являемся магазином Eclipse и используем смесь git
и EGit. Это не похоже на то, что git -media или git -fat может делать то, что я хочу, поскольку, поскольку вы могли бы заменить существующие большие файлы внешними эквивалентами, вам все равно придется переписывать историю, чтобы удалить большие файлы, которые уже были зафиксированы.
Итак, возможно ли разрезать репозиторий .git без перезаписи истории, или мы должны вернуться к плану использования git filter-branch
и целой загрузки перераспределений?
В стороне, полагайте, что это должно быть возможно, но, вероятно, связано с теми же ограничениями, что и в git
current неглубокий клон.
Git уже поддерживает несколько возможных мест для одного и того же blob, поскольку любой данный blob может находиться в свободное хранилище объектов (.git/objects
) или в файл пакета (.git/objects), поэтому теоретически вам просто нужно что-то вроде git-annex
, чтобы подключиться к этому уровень, а не выше (т.е. есть идея загрузки по требованию удаленного блоба, если хотите). К сожалению, я не могу найти никого, кто бы реализовал или даже предложил что-нибудь подобное.