Git копировать только определенные файлы с удаленного

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

Например, скажем, удаленная главная ветвь содержит (среди многих других) каталог с именем \src в который есть .cpp а также .h файлы. Как можно было бы получить только копию всего заголовка .h файлы?

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

Я рассмотрел архив git и sparse-checkout, но не смог понять, смогу ли я использовать их для достижения своей цели.

1 ответ

Существует два вида подмножеств, которые вы можете указать во время git clone:

  1. -b branchname --single-branch позволяет получить только те части истории, которые непосредственно ведут к branchname, Будет пропущено все, что не нужно, чтобы полностью описать branchname,
  2. --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 описывает его, и это не кажется диковинным, трудно использовать его самостоятельно.

Другие вопросы по тегам