Как мелко клонировать одну ветку в git? - PullRequest
10 голосов
/ 08 февраля 2011

У меня есть git-репо, на котором я хотел бы сделать поверхностную копию и вытащить только одну ветку.

Этот вопрос SO говорит, что git clone по умолчанию вытягивает все удаленные ветви.Я хотел бы сделать поверхностную копию только одной ветви.

Я делаю это для развертывания в производство.Полная проверка составляет более 400 МБ, а git-архив заголовка - всего 16 МБ.Похоже, что поведение клона, тянущего все ветви, приводит к тому, что моя загрузка оказывается намного больше, чем необходимо.

Ответы [ 3 ]

5 голосов
/ 08 февраля 2011

Якуб уже упоминал, что мелкий клон выбранных ветвей возможен , но довольно сложен для выполнения.
И добавил:

Примечаниетем не менее, поскольку ветви обычно делят большую часть своей истории, выгода от клонирования только подмножества ветвей может быть меньше, чем вы думаете.

Я бы добавил, что у вас не должно быть никакого инструмента VCS вФорма производства (вы устанавливаете / отслеживаете только то, что необходимо для производства до прогона ).
Таким образом, git archive остается лучшим способом извлечь то, что вам нужно, какархив (zip или tar, формат, который вы можете затем использовать без Git, после передачи на производственную сторону)


Обновление, март 2012 г .:

предстоящее git1.7.10 (апрель 2012) фактически позволит вам клонировать только одну ветку:

git clone --single-branch

Вы можете увидеть это в t5500-fetch-pack.sh:

test_expect_success 'single branch clone' '
  git clone --single-branch "file://$(pwd)/." singlebranch
'

Эта функция была затем исправлена ​​с помощью:

clone --single: ограничить выборку refspec для извлеченной ветви

После запуска "git clone --single ", в результирующем репозитории установлена ​​обычная стандартная ссылка" +refs/heads/*:refs/remotes/origin/* "для извлечения ссылки, что означает, что последующее" git fetch "в конечном итоге захватит все остальные ветви.

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

builtin / clone.c: правильно определить клон, начинающийся с тега

31b808a (clone --single:ограничить выборку refspec для fetched branch, 2012-09-20) пытался определить, является ли данная «ветвь», которой следует следовать, на самом деле тегом в удаленном репозитории, проверив «refs/tags/», но он неправильно использовал strstr(3);активно неправильно трактовать «ветку» «refs/heads/refs/tags/foo» и использовать логику для «1074 *» иерархии ссылок.
Что действительно хотел сделать код, так это посмотреть, начинается ли он с «refs/tags/".


Обновление сентября 2016: git clone --single-branch --branch tag будет работать для связанных тегов в Git 2.11+ (4 квартал 2016 года).

0 голосов
/ 17 апреля 2016

Последние версии git (у меня v2.7.3) поддерживают поверхностное клонирование только одной ветви путем вызова:

git clone --depth 1 <repository>
0 голосов
/ 09 февраля 2011

Вы можете просто сделать нормальный (неглубокий) клон, а затем удалить локальные лишние ветви (а также отслеживать удаленные ветви). У вас все равно будет весь сетевой трафик, но позже ваше дисковое пространство станет меньше.

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