Можно ли сделать редкую проверку без предварительной проверки всего хранилища? - PullRequest
147 голосов
/ 06 ноября 2010

Я работаю с репозиторием с очень большим количеством файлов, для извлечения которых требуются часы.Я изучаю возможность того, будет ли Git хорошо работать с этим типом репозитория, теперь, когда он поддерживает разреженные извлечения, но каждый пример, который я могу найти, делает следующее:команда оригинального клона тоже делает оформление заказа.Если вы добавляете -n к исходной команде клонирования, то команда read-tree приводит к следующей ошибке:

ошибка: Разреженная проверка не оставляет записи в рабочем каталоге

Как это можно сделатьоформить заказ, предварительно не проверив все файлы?

Ответы [ 10 ]

143 голосов
/ 05 февраля 2011

Обратите внимание, что этот ответ загружает полную копию данных из хранилища. Команда 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

Теперь вы обнаружите, что у вас есть «сокращенная» проверка, в которой присутствуют только файлы из path / inside_repo / to / required_subdir (и по этому пути).

Обратите внимание, что в командной строке Windows вы не должны указывать путь, т. Е. Вы должны изменить шестую команду с помощью этой:

echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout

если вы этого не сделаете, вы получите кавычки в файле разреженной проверки, и он не будет работать

34 голосов
/ 30 июля 2014

Git clone имеет параметр (--no-checkout или -n), который делает то, что вы хотите.

В вашем списке команд просто измените:

git clone <path>

На это:

git clone --no-checkout <path>

Затем можно использовать разреженную проверку, как указано в вопросе.

15 голосов
/ 05 марта 2017

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

Я нашел ответ, который искал, в однострочнике, опубликованном ранее 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.

8 голосов
/ 01 октября 2014

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


Критическим моментом, чтобы заставить его работать, было добавление /* после имени папки.

У меня есть git 1.9

5 голосов
/ 14 апреля 2016

git 2.9 (июнь 2016 г.) обобщит параметр --no-checkout на git worktree add (команда, которая позволяет работать с несколькими рабочими деревьями для одного репо )

См. коммит ef2a0ac (29 марта 2016 г.) от Рэй Чжан (OneRaynyDay) .
Помощник: Эрик Саншайн (sunshineco) и Хунио С. Хамано (gitster) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 0d8683c , 13 апреля 2016 г.)

Справочная страница git worktree теперь включает в себя:

--[no-]checkout:

По умолчанию add извлекает <branch>, однако --no-checkout может использоваться для подавления извлечения для выполнения настроек, , таких как настройка sparse-checkout .

4 голосов
/ 06 ноября 2010

Я новичок в git, но кажется, что если я делаю git checkout для каждого каталога, то это работает.Кроме того, файл sparse-checkout должен иметь косую черту после каждого каталога, как указано.Кто-то еще опыт, пожалуйста, подтвердите, что это будет работать.

Интересно, что если вы извлекаете каталог не в файле sparse-checkout, это, кажется, не имеет значения.Они не отображаются в состоянии git и git read-tree -m -u HEAD не приводит к его удалению.git reset --hard также не вызывает удаление каталога.Кто-нибудь более опытный хочет прокомментировать, что git думает о каталогах, которые извлекаются, но которых нет в файле разреженного извлечения?

3 голосов
/ 05 января 2019

Шаги для разреженной проверки только определенной папки:

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]
3 голосов
/ 09 июня 2016

Да, возможна загрузка папки вместо загрузки всего хранилища.

Хороший способ обновления 10/4/2019

D:\Lab>git svn clone https://github.com/Qamar4P/LolAdapter.git/trunk/lol-a
dapter -r HEAD
  1. -r HEAD будет загружать только последнюю ревизию, игнорируя всю историю.

  2. Примечание транк и / specific-folder

Наслаждайтесь:)

Метод 2

Ни один из вышеперечисленных методов не работает для меня. Вот что я сделал ...

  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/ / багажник добавляется в конце

Пример: svn export https://github.com/gearvrf/GearVRf-Demos.git/trunk/gvr-renderableview

Надеюсь, это кому-нибудь поможет. ref: https://stackoverflow.com/a/18324458/5710872

2 голосов
/ 03 мая 2019

На основании этого ответа от apenwarr и этого комментария от Miral Я нашел следующее решение, которое спасло меня почти на 94 % дискового пространства при локальном клонировании репозитория linux git, когда требуется только один подкаталог 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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...