Можно ли сделать редкую проверку без предварительной проверки всего хранилища?

Я работаю с репозиторием с очень большим количеством файлов, для извлечения которых требуются часы. Я изучаю возможность того, будет ли 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 вот что я сделал..

  1. Если пользователь Windows загрузит и установит SlikSvn_x84, добавьте этот "C:\Program Files (x86)\SlikSvn\bin" в переменную среды Path. Пользователь Mac использует альтернативный клиент SVN.

  2. Используйте командную строку: 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
Другие вопросы по тегам