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