Как я могу проверить вспомогательную директиву в огромном репозитории git с указанной веткой и с разреженной проверкой?
например, я хочу получить эту папку https://github.com/python/cpython/tree/2.7/Tools/freeze
Команда, которую я запускал, была:
mkdir python
cd python
git init
git remote add origin https://github.com/python/cpython.git
git config core.sparsecheckout true
echo "Tools/freeze/*" >> .git/info/sparse-checkout
# find remote branches
git remote show origin
# this works and pulls only that folder
git pull --depth=1 origin master
# but this doesn't, why?
git pull --depth=1 origin 2.7
# but how do I switch to remote 2.7 branch?
git checkout --track -b 2.7 origin/2.7
fatal: Cannot update paths and switch to branch '2.7' at the same time.
Did you intend to checkout 'origin/2.7' which can not be resolved as commit?
Я читал где-то, что мне нужно запустить git fetch
перед проверкой, но это своего рода поражение цели разреженной проверки, мой интернет медленный, и репо огромно. Как я могу получить этот подкаталог с ветвью 2.7? Спасибо!
Это на windows8 и git bash
изменить:
если бы я побежал
git pull --depth=1 origin 2.7
он вытащит удаленную ветвь 2.7, но он также добавит все остальные файлы в мой рабочий каталог, а если я запустил git pull --depth=1 origin master
, он только приносит каталог Tools/freeze
в главную ветку? почему это происходит?
другой пример:
mkdir qt
cd qt
git init
git remote add origin https://github.com/qtproject/qt.git
git config core.sparsecheckout true
echo util/qlalr/examples/lambda/* >> .git/info/sparse-checkout
git pull --depth=1 origin 4.8
Эта папка util/qlalr/examples/lambda
очень мала, но когда она запускает последнюю команду, она все еще медленная, этого можно избежать?
edit2: Я понял, что это невозможно с текущим git. но теперь мой единственный левый вопрос: почему git pull --depth=1 origin 2.7
не учитывает редкую конфигурацию проверки?
Ответы
Ответ 1
Не удалось выполнить проверку, потому что вытаскивание (и, следовательно, выборка) явного рефлекса дает только это ref, поэтому после вашего первоначального притяжения ваше репо имело только refs/heads/master
и refs/remotes/origin/master
, оба указывали на одно и то же commit. Checkout of 2.7 не работает, потому что у вашего репо не было ничего по этому имени.
Pull выполняет слияние, а дополнительный контент git pull origin 2.7
, помещенный в вашу рабочую строку, существует для разрешения конфликтов, слияние не может определить правильные результаты, поэтому вам нужно. Вы увидите, что не все вне каталога "Сервис" выгружено, а только конфликтующие файлы. Я не уверен, как слияние с мелкой выборкой и редким оформлением должно вести себя в целом, но, конечно, нужно только разрешать разрешение конфликтов.
Выполнение мелкой выборки с одним рефлексием является таким же легким, как и git, если одноразовое использование полосы пропускания действительно так дорого, вы можете клонировать экземпляр ec2 и помечать определенное дерево.
Ответ 2
Попробуйте это
mkdir
cd
git init
git remote add -f origin <url>
Это создает пустой репозиторий и извлекает все объекты, но не проверяет их. Затем выполните:
git config core.sparseCheckout true
Теперь определите, какие папки вы хотите. Это сделано, добавив его.
git/Информация/разреженных Checkout,
echo "some/dir/" → .git/info/sparse-checkout echo "another/sub/tree" → .git/info/sparse-checkout
Тогда
git pull origin master
Ответ 3
Прежде всего установите параметр конфигурации:
# Enable sparse-checkout:
git config core.sparsecheckout true
Настройте пути разреженной проверки в .git/info/sparse-checkout:
# Add the relevant path to the sparse-checkout file
echo cpython/tree/2.7/Tools/freeze >> .git/info/sparse-checkout
Обновите рабочее дерево:
git read-tree -mu HEAD
git-read-tree
Читает информацию о деревьях в индекс
-m
Выполните слияние, а не только прочитанное
-u
После успешного слияния обновите файлы в дереве работы с результатом слияния.
sparse checkout
При разреженной проверке вы в основном говорите Git, чтобы исключить определенный набор файлов из рабочего дерева.
Эти файлы все равно будут частью репозитория, но они не будут отображаться в вашем рабочем каталоге.
Внутри редкая проверка использует флаг skip-worktree
, чтобы пометить все исключенные файлы как всегда обновляемые.
# enable sparse checkout in an existing repository:
git config core.sparseCheckout true
# Create a .git/info/sparse-checkout file containing the
# paths to include/exclude from your working directory.
# Update your working directory with
git read-tree -mu HEAD