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

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

git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD

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

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

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

Ответ 1

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

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

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

Ответ 2

Git У клона есть опция (--no-checkout или -n), которая делает то, что вы хотите.

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

git clone <path>

Для этого:

git clone --no-checkout <path>

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Хороший способ сделать это

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

  2. Примечание багажник и /specific-folder

Скопируйте и измените URL до и после /trunk/. Надеюсь, это кому-нибудь поможет. Наслаждайтесь :)

Обновлено 26 сентября 2019 г.

Ответ 7

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

См. commit ef2a0ac (29 марта 2016 г.) Рэй Чжан (OneRaynyDay).
Помощник: Eric Sunshine (sunshineco) и Junio C Hamano (gitster).
(слияние Junio ​​C Hamano - gitster - в commit 0d8683c, 13 апреля 2016 г.)

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

--[no-]checkout:

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

Ответ 8

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

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]

Ответ 9

На основании этого ответа по 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, мы, вероятно, можем сэкономить еще несколько мегабайт. (Чтение man-страницы git-rev-list также намекает на то, что есть что-то вроде --filter=sparse:path=…, но я тоже не смог сработать.

(Все пробовали с помощью git 2.20.1 от Debian Buster.)

Ответ 10

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

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