Git копировать только определенные файлы с удаленного
Я пытаюсь понять, как (и если это возможно) копировать только определенные файлы определенного каталога из remote
в Git. (не заинтересован в продолжении работы с этими файлами или получении истории)
Например, скажем, удаленная главная ветвь содержит (среди многих других) каталог с именем \src
в который есть .cpp
а также .h
файлы. Как можно было бы получить только копию всего заголовка .h
файлы?
Конечно, я смотрю, существует ли подход, который не приведет к переписыванию репо или другим нежелательным побочным эффектам. Просто получить локальную копию только некоторых указанных файлов с пульта.
Я рассмотрел архив git и sparse-checkout, но не смог понять, смогу ли я использовать их для достижения своей цели.
1 ответ
Существует два вида подмножеств, которые вы можете указать во время git clone
:
-b branchname --single-branch
позволяет получить только те части истории, которые непосредственно ведут кbranchname
, Будет пропущено все, что не нужно, чтобы полностью описатьbranchname
,--depth n
позволяет обрезать историю за определенную глубину.
Помимо этого, clone
(так же как commit
, push
, pull
, merge
) и так далее всегда в процессе проектирования все дерево каталогов, начиная с корня. commit
(объект) - это элемент, с которым они работают, они не знают об отдельных файлах (например, в отличие от CVS или SubVersion, которые могут и регулярно выполняют работу с отдельными файлами).
Есть несколько способов работы с конкретными файлами / каталогами, но они довольно низкоуровневые и, вероятно, не то, что вам нужно. Например, вы можете использовать протокол git для прямой выборки отдельных объектов git (коммитов, деревьев, BLOB-объектов...), но я чувствую, что вы не об этом.
Обновление: если вы хотите просто захватить файл и игнорировать историю, то вы можете использовать --depth 1
(чтобы получить все дерево каталогов, но только для одного коммита), захватите ваши файлы и покончите с этим. Вам все равно нужно будет загрузить намного больше, чем вам нужно, но по крайней мере это будет на целую величину меньше, чем вся история (для чего-то большого, например, ядра Linux).
Обновление 2: Я почти уверен, что, кроме вашей собственной реализации сетевого протокола git, нет способа извлекать отдельные кусочки с пульта с помощью команд git. Если вы говорите протокол самостоятельно, это (относительно) легко, конечно. http://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols описывает его, и это не кажется диковинным, трудно использовать его самостоятельно.