Я работаю с репозиторием с очень большим количеством файлов, для извлечения которых требуются часы. Я изучаю возможность того, будет ли Git хорошо работать с этим типом репозитория, поскольку он поддерживает разреженные извлечения, но каждый пример, который я могу найти, делает следующее:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
Проблема с этой последовательностью команд заключается в том, что оригинальный клон также выполняет проверку. Если вы добавите -n к исходной команде клонирования, то команда read-tree приведет к следующей ошибке:
ошибка: редкая проверка не оставляет записи в рабочем каталоге
Как можно сделать редкую проверку, не проверив сначала все файлы?
git worktree add --no-checkout
будет работать (не толькоgit clone --no-checkout
) с git 2.9 (Just 2016). Смотрите мой ответ нижеОтветы:
В 2020 году существует более простой способ справиться с разреженной проверкой, не беспокоясь о файлах .git. Вот как я это сделал:
Обратите внимание, что для этого требуется установленная версия git 2.25. Подробнее об этом читайте здесь: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/
ОБНОВИТЬ:
Приведенная выше
git clone
команда все еще будет клонировать репо с его полной историей, но без проверки файлов. Если вам не нужна полная история, вы можете добавить в команду параметр --depth , например:источник
sparse-checkout --cone
функцией в stackoverflow.com/a/59515426/6309--filter
) к вашему ответу здесь.--depth
параметр, который позволяет нам делать мелкий клон. Это поможет? @ Тао, не уверен, как использовать--filter
в этом случае, я не пробовал. Не могли бы вы привести пример или опубликовать другой ответ на эту тему?Обратите внимание, что этот ответ загружает полную копию данных из хранилища. Команда
git remote add -f
клонирует весь репозиторий. Со страницы руководстваgit-remote
:Попробуй это:
Теперь вы обнаружите, что у вас есть «сокращенная» проверка, в которой присутствуют только файлы из пути / inside_repo / to / required_subdir (и по этому пути).
Обратите внимание, что в командной строке Windows вы не должны заключать путь в кавычки, то есть вы должны изменить шестую команду с помощью этой:
если вы этого не сделаете, вы получите кавычки в файле sparse-checkout, и он не будет работать
источник
git remote add
загружает все, потому что это то, что-f
делает - говорит ей немедленно выбрать, прежде чем вы определили параметры разреженного извлечения. Но пропустить или изменить порядок, который не поможет. Разреженные проверки влияют только на рабочее дерево, а не на хранилище. Если вы хотите, чтобы ваш репозиторий садился на диету, тогда вам нужно посмотреть на опции--depth
или--single-branch
.Git клон имеет опцию (
--no-checkout
или-n
), которая делает то, что вы хотите.В вашем списке команд просто измените:
К этому:
Затем вы можете использовать редкие проверки, как указано в вопросе.
источник
--depth <depth>
опцию на git clone. Это загрузит только последние<depth>
коммиты из истории. В настоящее время нет возможности частично загрузить один коммит с помощью git, хотя, если ваш пульт поддерживает его, вы можете использовать егоgit archive --remote
для загрузки частичных наборов файлов.У меня был похожий вариант использования, за исключением того, что я хотел извлечь только коммит для тега и удалить каталоги. Использование
--depth 1
делает его действительно разреженным и может действительно ускорить процесс.источник
Я нашел ответ, который искал, в однострочнике, опубликованном ранее pavek (спасибо!), Поэтому я хотел предоставить полный ответ в одном ответе, который работает на Linux (GIT 1.7.1):
Я немного изменил порядок команд, но это, похоже, не оказывает никакого влияния. Ключом является наличие косой черты "/" в конце пути на шаге 5.
источник
К сожалению, ничего из вышеперечисленного не помогло мне, поэтому я потратил очень много времени, пытаясь найти другую комбинацию
sparse-checkout
файлов.В моем случае я хотел пропустить папки с конфигами IntelliJ IDEA.
Вот что я сделал:
Бегать
git clone https://github.com/myaccount/myrepo.git --no-checkout
Бегать
git config core.sparsecheckout true
Создано
.git\info\sparse-checkout
со следующим содержаниемЗапустите «git checkout -», чтобы получить все файлы.
Главное, чтобы это работало, было добавить
/*
имя папки.У меня есть мерзавец 1.9
источник
Да, можно скачать папку вместо загрузки всего хранилища. Даже любой / последний коммит
Хороший способ сделать это
-r HEAD загрузит только последнюю ревизию, игнорируя всю историю.
Обратите внимание на ствол и / specific-folder
Скопируйте и измените URL до и после
/trunk/
. Надеюсь, это кому-нибудь поможет. Наслаждаться :)Обновлено 26 сентября 2019 г.
источник
Обновленный ответ 2020:
Теперь есть команда
git sparse-checkout
, которую я подробно представляю с помощью Git 2.25 (первый квартал 2020 года).nicono «s ответ показывает его использование:
Он развивался с Git 2.27 и знает, как «повторно» использовать редкие проверки, как здесь .
Обратите внимание, что в Git 2.28
git status
будет упоминаться, что вы находитесь в заархивированном хранилище.Оригинальный ответ: 2016
git 2.9 (июнь 2016 г.) обобщит
--no-checkout
опцию наgit worktree add
(команда, которая позволяет работать с несколькими рабочими деревьями для одного репо )Смотрите коммит ef2a0ac (29 марта 2016 г.) от Ray Zhang (
OneRaynyDay
) .Помогают: Эрик Саншайн (
sunshineco
) и Хунио С. Хамано (gitster
) .(Объединено Junio C Hamano -
gitster
- в коммите 0d8683c , 13 апреля 2016 г.)Страница
git worktree
man теперь включает в себя:источник
Шаги для разреженной проверки только конкретной папки:
источник
На основании этого ответа по apenwarr и этот комментарий по Miral я придумал следующее решение , которое спасло меня почти 94% дискового пространства при клонировании в Linux мерзавец хранилище локально в то время как только хочет один подкаталог Documentation:
Таким образом, я сократился с 2,9 ГБ до 182 МБ, что уже довольно приятно.
Я, однако, не стал работать с этим
git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test
( намекнул здесь ), поскольку все отсутствующие файлы были добавлены в индекс как удаленные. Так что, если кто-нибудь знает эквивалентgit clone --filter=blob:none
дляgit fetch
, мы можем сэкономить еще несколько мегабайт. (Чтение справочной страницыgit-rev-list
также намекает, что есть что-то вроде--filter=sparse:path=…
, но у меня это тоже не получилось.(Все пробовали с помощью git 2.20.1 от Debian Buster.)
источник
--filter=sparse:path=…
.Я новичок в git, но кажется, что если я делаю git checkout для каждого каталога, то это работает. Кроме того, файл sparse-checkout должен иметь косую черту после каждого каталога, как указано. Кто-то еще опыт, пожалуйста, подтвердите, что это будет работать.
Интересно, что если вы извлекаете каталог, которого нет в файле sparse-checkout, это, похоже, не имеет значения. Они не отображаются в состоянии git и git read-tree -m -u HEAD не приводит к его удалению. git reset --hard также не вызывает удаление каталога. Кто-нибудь более опытный хочет прокомментировать, что git думает о каталогах, которые извлекаются, но которых нет в файле разреженного извлечения?
источник
В git 2.27 похоже, что git sparse checkout эволюционировал. Решение в этом ответе не работает точно так же (по сравнению с git 2.25)
Эти команды работали лучше:
Смотрите также: git-clone --sparse и git-sparse-checkout add
источник
В моем случае я хочу пропустить
Pods
папку при клонировании проекта. Я сделал шаг за шагом, как показано ниже, и это работает для меня. Надеюсь, поможет.Напоминание: если вы хотите пропустить больше папок, просто добавьте больше строк в файл sparse-checkout.
источник