Как git клонировать подкаталог определенной ветви удаленного репозитория? - PullRequest
0 голосов
/ 18 апреля 2020

Предупреждение - не требует настройки git (если требуемые параметры заменены на правильные, включены / отключены по умолчанию в последних git версиях и требуют настройки только для более старых версий, тогда все должно быть в порядке).

Репозиторий git является удаленным репозиторием, размещенным на Github.

Клонирование одной ветви кажется простым с помощью --branch <branchname> --depth 1 или --branch <branchname> --single-branch.

Клонирование подкаталога хранилище немного сложнее. Я нашел несколько вопросов StackOverflow, спрашивающих, как это сделать -

  1. Как мне клонировать только подкаталог репозитория Git?
  2. Клонирование только подкаталог с git
  3. клонированными частями проекта github

, но единственные ответы, не включающие прыжки через обручи, имели некоторые недостатки моего варианта использования -

  1. { ссылка } - Я думаю, что файл должен быть локальным репо и не будет работать с удаленным репо.
  2. { ссылка } - недостатком является то, что, хотя он позволяет мне клонировать подкаталог удаленного репо, он заставляет меня работать с мастером, а не с веткой по моему выбору.

Кроме того, я бы предпочел не клонировать всю историю и ветки, так как это огромный репо и оставить --depth 1 или -r HEAD или альтернативную команду, которая не будет клонировать все. Но если это невозможно, это нормально.

1 Ответ

0 голосов
/ 19 апреля 2020

Вы буквально не можете делать то, что хотите: git clone не будет клонировать подкаталог.

Возможно, вы сможете довольно легко сделать то, что вам нужно . Это зависит от того, какой у вас доступ к репозиторию Git на удаленной машине.

Как прокомментировал chepner , Git store commits . Сами коммиты образуют цепочки, которые люди обычно называют ответвлениями . Любая данная цепочка заканчивается в последнем коммите , который Git вызывает tip commit ветви, а имя ветки просто идентифицирует этот самый последний коммит по его ha sh ID. (Каждый коммит имеет уникальный га sh ID.)

Теперь каждый коммит, независимо от того, где он находится в репозитории, содержит каждый файл . Файлы внутри каждого коммита хранятся в специальной форме, доступной только для чтения, Git -только, с применением сжатия и различными приемами, так что повторная фиксация файла того же не занимает дополнительного места. Только сам Git может читать этот специальный формат. 1

Точнее, коммит содержит каждый файл, который должен быть в этом коммите, например, если у вас есть хранилище в целом, затем вы можете сказать Git: get me commit a123456... (по его номеру ha sh), и Git извлечет фиксацию в рабочую область. В рабочей области у вас теперь будут обычные файлы в обычном повседневном формате, с которым вы можете работать. (Вот почему мы называем это вашей рабочей областью, или рабочим деревом или рабочим деревом .)

Обратите внимание, однако, что это означает, что каждый коммит равен также архив . В дистрибутивы Git входит команда git archive, которая превращает архив Git -specifi c в один из двух стандартных форматов архива, отличных от Git: zip или tar. (В будущем может быть добавлено больше форматов, но эти два были в Git в течение почти 10 * *.)

Это означает, что любой, у кого есть клон репозитория, может включите любой коммит в один из этих архивов. Затем вы можете использовать сам архиватор - unzip или tar - для извлечения только нужного подмножества файлов в этом одном архиве.

Если сайт с репозиторием Git позволяет запускать произвольно команды, go там и создайте архив из коммитов, файлы которых вы хотите, затем управляйте архивом там. Если сайт GitHub или аналогичный, имейте в виду, что они предлагают интерфейс для получения архива tar или zip из любого данного коммита и используют его для копирования этого архива на ваш компьютер и манипулирования этим архивом там.

Репозиторий git является удаленным репозиторием, размещенным на Github.

Таким образом, вы можете получить zip-архив любого коммита с помощью любого веб-браузера: перейдите к нужному коммиту, нажмите «клонировать» или загрузите ", выберите" zip ", и браузер должен сохранить полученный zip-файл где-нибудь.

(Чтобы автоматизировать это, запишите URL, с которого загружается zip-файл. Вероятно, он будет иметь коммит ha sh ID, встроенный в него. Используйте программу типа curl, чтобы загружать файлы самостоятельно, без запуска браузера.)

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

Если ни один из них недоступен, вы можете использовать git clone -b <branch-name> --single-branch --depth 1, чтобы сделать неглубокий клон , имеющий глубину 1, т. Е. Только один коммит, который копирует только один коммит, идентифицированный указанной ветвью. Теперь у вас есть очень ограниченный клон, в котором есть только один коммит, так что теперь вы можете запустить git archive на одном коммите, если хотите. Конечно, на этом этапе вы можете просто git checkout один коммит, затем переместить весь нужный подкаталог из рабочего дерева и затем удалить репозиторий Git.

Независимо от того, что вы делаете, вы не можете положить этот материал обратно в исходный репозиторий Git, не имея реального - возможно мелкого - клона исходного репозитория Git. В вашем вопросе никогда не упоминается, что вы планируете делать с этим подкаталогом, который вы извлекли из одного конкретного коммита.


1 Формат: publi c Таким образом, любой может написать программу для чтения. Программа для его чтения, в основном, Git, поэтому вы можете просто использовать Git, особенно потому, что Git оставляет за собой право иметь будущие форматы, и если вы напишите свою собственную версию Git и Git добавит новый формат в следующем году, который работает лучше в некоторых случаях, вам также придется обновить свою собственную программу.

2 git subtree предоставляет инструменты для выполнения чего-то совершенно другого в механизме , но схожи с точки зрения некоторых своих целей. Поддеревья, которые были разделены, могут быть повторно включены позже, если вы будете следовать множеству очень специфических правил. Однако для использования git subtree вам потребуется полный клон, который вы уже отклонили в качестве опции. Сами правила также сложны («прыжки через обручи»), что вы считаете нежелательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...