Можно ли сделать редкую проверку без предварительной проверки всего хранилища?
Я работаю с репозиторием с очень большим количеством файлов, для извлечения которых требуются часы. Я изучаю возможность того, будет ли Git хорошо работать с этим типом репозитория, поскольку он поддерживает разреженные извлечения, но каждый пример, который я могу найти, делает следующее:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
Проблема с этой последовательностью команд заключается в том, что оригинальный клон также выполняет проверку. Если вы добавите -n к исходной команде клонирования, то команда read-tree приведет к следующей ошибке:
ошибка: редкая проверка не оставляет записи в рабочем каталоге
Как можно сделать редкую проверку, не проверив сначала все файлы?
16 ответов
Обратите внимание, что этот ответ загружает полную копию данных из хранилища. git remote add -f
Команда клонирует весь репозиторий. Из справочной страницыgit-remote
:
С
-f
вариант,git fetch <name>
запускается сразу после настройки удаленной информации.
Попробуй это:
mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add -f origin git://...
echo "path/within_repo/to/desired_subdir/*" > .git/info/sparse-checkout
git checkout [branchname] # ex: master
Теперь вы обнаружите, что у вас есть "сокращенная" проверка, в которой присутствуют только файлы из пути / inside_repo / to / required_subdir (и по этому пути).
Обратите внимание, что в командной строке Windows вы не должны заключать путь в кавычки, то есть вы должны изменить шестую команду с помощью этой:
echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout
если вы этого не сделаете, вы получите кавычки в файле sparse-checkout, и он не будет работать
В 2020 году есть более простой способ справиться с разреженной проверкой, не беспокоясь о файлах.git. Вот как я это сделал:
git clone <URL> --no-checkout <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout
# they are checked out immediately after this command, no need to run git pull
Обратите внимание, что для этого требуется установка git версии 2.25. Подробнее об этом читайте здесь: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/
ОБНОВИТЬ:
Над git clone
команда по-прежнему будет клонировать репо с его полной историей, но без проверки файлов. Если вам не нужна полная история, вы можете добавить к команде параметр --depth, например:
# create a shallow clone,
# with only 1 (since depth equals 1) latest commit in history
git clone <URL> --no-checkout <directory> --depth 1
Работает в git 2.28
git clone --filter=blob:none --no-checkout --depth 1 --sparse <project-url>
cd <project>
git sparse-checkout init --cone
Укажите файлы и папки, которые вы хотите клонировать
git sparse-checkout add <folder>/<innerfolder> <folder2>/<innerfolder2>
git checkout
Git clone имеет опцию (--no-checkout
или же -n
) то, что вы хотите.
В вашем списке команд просто измените:
git clone <path>
К этому:
git clone --no-checkout <path>
Затем вы можете использовать редкие проверки, как указано в вопросе.
У меня был похожий вариант использования, за исключением того, что я хотел извлечь только коммит для тега и удалить каталоги. С помощью --depth 1
делает его действительно разреженным и может действительно ускорить процесс.
mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add origin <url> # Note: no -f option
echo "path/within_repo/to/subdir/" > .git/info/sparse-checkout
git fetch --depth 1 origin tag <tagname>
git checkout <tagname>
Я нашел ответ, который искал, в однострочнике, опубликованном ранее pavek (спасибо!), Поэтому я хотел предоставить полный ответ в одном ответе, который работает в Linux (GIT 1.7.1):
1--> mkdir myrepo
2--> cd myrepo
3--> git init
4--> git config core.sparseCheckout true
5--> echo 'path/to/subdir/' > .git/info/sparse-checkout
6--> git remote add -f origin ssh://...
7--> git pull origin master
Я немного изменил порядок команд, но это, похоже, не оказывает никакого влияния. Ключом является наличие косой черты "/" в конце пути на шаге 5.
Git 2.9 (июнь 2016) будет обобщать --no-checkout
возможность git worktree add
(команда, которая позволяет работать с несколькими рабочими деревьями за один репо)
Смотрите коммит ef2a0ac (29 марта 2016 г.) от Ray Zhang ( OneRaynyDay
)
Помогает: Эрик Саншайн ( sunshineco
) и Junio C Hamano ( gitster
)
(Объединено Юнио С Хамано - gitster
- в коммите 0d8683c, 13 апреля 2016 г.)
git worktree
Страница man теперь включает в себя:
--[no-]checkout:
По умолчанию,
add
проверяет<branch>
, тем не мение,--no-checkout
может использоваться для подавления извлечения для настройки, такой как настройка sparse-checkout.
К сожалению, ничего из вышеперечисленного не помогло мне, поэтому я потратил очень много времени, пытаясь использовать различные комбинации sparse-checkout
файл.
В моем случае я хотел пропустить папки с конфигами IntelliJ IDEA.
Вот что я сделал:
Бежать git clone https://github.com/myaccount/myrepo.git --no-checkout
Бежать git config core.sparsecheckout true
созданный .git\info\sparse-checkout
со следующим содержанием
!.idea/*
!.idea_modules/*
/*
Запустите "git checkout -", чтобы получить все файлы.
Критическая вещь, чтобы заставить это работать, должна была добавить /*
после имени папки.
У меня есть мерзавец 1.9
На основании этого ответа по apenwarr и этот комментарий по Miral я придумал следующее решение, которое спасло меня почти 94% дискового пространства при клонировании в Linux мерзавец хранилище локально в то время как только хочет один подкаталог Documentation:
$ cd linux
$ du -sh .git .
2.1G .git
894M .
$ du -sh
2.9G .
$ mkdir ../linux-sparse-test
$ cd ../linux-sparse-test
$ git init
Initialized empty Git repository in /…/linux-sparse-test/.git/
$ git config core.sparseCheckout true
$ git remote add origin ../linux
# Parameter "origin master" saves a tiny bit if there are other branches
$ git fetch --depth=1 origin master
remote: Enumerating objects: 65839, done.
remote: Counting objects: 100% (65839/65839), done.
remote: Compressing objects: 100% (61140/61140), done.
remote: Total 65839 (delta 6202), reused 22590 (delta 3703)
Receiving objects: 100% (65839/65839), 173.09 MiB | 10.05 MiB/s, done.
Resolving deltas: 100% (6202/6202), done.
From ../linux
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
$ echo "Documentation/hid/*" > .git/info/sparse-checkout
$ git checkout master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Already on 'master'
$ ls -l
total 4
drwxr-xr-x 3 abe abe 4096 May 3 14:12 Documentation/
$ du -sh .git .
181M .git
100K .
$ du -sh
182M .
Итак, я снизил размер с 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.)
Да, sparse-checkout загружает весь материал, чтобы загрузить папку из git. Ни один из вышеперечисленных методов не работает для меня. Чтобы загрузить только один образец с https://github.com/gearvrf/GearVRf-Demos вот что я сделал..
Если пользователь Windows загрузит и установит SlikSvn_x84, добавьте этот "C:\Program Files (x86)\SlikSvn\bin" в переменную среды Path. Пользователь Mac использует альтернативный клиент SVN.
Используйте командную строку:
svn export https://github.com/foobar/Test.git/trunk/foo
Обратите внимание на формат URL:
Базовый URL-адрес https://github.com// trunk добавляется в конце
Пример: svn export https://github.com/gearvrf/GearVRf-Demos.git/trunk/gvr-renderableview
Надеюсь, это кому-нибудь поможет. ссылка: /questions/19247329/zagruzite-odnu-papku-ili-katalog-iz-repozitoriya-github/19247351#19247351
Шаги для разреженной проверки только конкретной папки:
1) git clone --no-checkout <project clone url>
2) cd <project folder>
3) git config core.sparsecheckout true [You must do this]
4) echo "<path you want to sparce>/*" > .git/info/sparse-checkout
[You must enter /* at the end of the path such that it will take all contents of that folder]
5) git checkout <branch name> [Ex: master]
В git 2.27 похоже, что git sparse checkout эволюционировал. Решение в этом ответе не работает точно так же (по сравнению с git 2.25)
git clone <URL> --no-checkout <directory> cd <directory> git sparse-checkout init --cone # to fetch only root files git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout # they are checked out immediately after this command, no need to run git pull
Эти команды работали лучше:
git clone --sparse <URL> <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout add apps/my_app
git sparse-checkout add libs/my_lib
См. Также: git-clone --sparse и git-sparse-checkout add
Я новичок в git, но кажется, что если я делаю git checkout для каждого каталога, то это работает. Кроме того, файл sparse-checkout должен иметь косую черту после каждого каталога, как указано. Кто-то еще опыт, пожалуйста, подтвердите, что это будет работать.
Интересно, что если вы извлекаете каталог, который отсутствует в файле sparse-checkout, это, похоже, не имеет значения. Они не отображаются в состоянии git и git read-tree -m -u HEAD не вызывает его удаление. git reset --hard также не вызывает удаление каталога. Кто-нибудь более опытный хочет прокомментировать, что git думает о каталогах, которые извлекаются, но которых нет в файле разреженного извлечения?
Я взял это из библиотеки определений TypeScript @types:
Допустим, репо имеет такую структуру:
types/
|_ dependency/
⚠️ Для этого требуется минимальная версия git 2.27.0, которая, вероятно, новее, чем версия по умолчанию на большинстве машин. Более сложные процедуры доступны в более старых версиях, но не рассматриваются в этом руководстве.
git clone --sparse --filter=blob:none --depth=1 <forkedUrl>
git sparse-checkout add types/<type> types/<dependency type> ...
Это позволит проверить папку types / identity на вашем локальном компьютере.
--sparse
инициализирует файл разреженного извлечения, поэтому рабочий каталог начинается только с файлов в корне репозитория.
--filter=blob:none
исключает файлы, извлекая их только по мере необходимости.
--depth=1
еще больше повысит скорость клонирования за счет усечения истории фиксации, но это может вызвать проблемы, описанные здесь .
В моем случае я хочу пропустить Pods
папка при клонировании проекта. Я сделал шаг за шагом, как показано ниже, и у меня это работает. Надеюсь, это поможет.
mkdir my_folder
cd my_folder
git init
git remote add origin -f <URL>
git config core.sparseCheckout true
echo '!Pods/*\n/*' > .git/info/sparse-checkout
git pull origin master
Напоминание, если вы хотите пропустить больше папок, просто добавьте больше строк в файл разреженной проверки.
Принятый ответ не полностью сработал для меня, поскольку он также загружает файлы из корневой папки.
Вот так я скачал только одну нужную мне папку:
git clone --no-checkout --depth=1 --filter=blob:none --branch=$(VERSION) $(REPO_URL) && \
cd $(REPO_NAME) && \
git config core.sparseCheckout true && \
echo "$(FOLDER)/" >> .git/info/sparse-checkout && \
git checkout