Как я могу проверить вспомогательную директиву в огромном репозитории 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

введите описание изображения здесь