В мерзавце, как я проверяю удаленные ответвления удаленного репозитория?

Мне клонировали локальный репозиторий из пустого удаленного репозитория. Следующие списки команд al ответвления удаленного репозитория.

$ git ls-remote <remote>

74bd3eb190edb39db04f6c0c4dbbb9e1e96bc6db    refs/remotes/test
85de54d6ae813c624b9623983e6b0a4948dae0fe    refs/remotes/trunk

Я хочу к контролю и отслеживаю удаленную соединительную линию ответвления того remote. Как я делаю это?

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

$ git branch -a

master
remotes/test
remotes/trunk

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

$ git branch -r

repo/HEAD -> repo/master
repo/master
15
задан Hans Sjunnesson 14 June 2010 в 12:01
поделиться

4 ответа

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

По умолчанию настроенные пульты дистанционного управления будут получать данные только из пространства имен удаленного репозитория refs / Heads / , поэтому они не будут получать ничего внутри refs / remotes / . Но вы можете обратиться к ссылке внутри него, используя полную ссылку, например refs / remotes / trunk ( remotes / trunk также могут работать, но также могут быть неоднозначными).

Если полученная ссылка не указывает ссылку назначения, она будет сохранена в специальной ссылке FETCH_HEAD.


Получить репозиторий refs / remote / trunk в FETCH_HEAD и извлечь его как отдельную HEAD:

git fetch remote-name-or-url refs/remotes/trunk &&
git checkout FETCH_HEAD

То же самое, но создать именованную локальную ветвь вместо использования отдельной HEAD:

git fetch remote-name-or-url refs/remotes/trunk &&
git checkout -b trunk-from-remote FETCH_HEAD

То же самое, но непосредственно в локальную ветку:

git fetch remote-name-or-url refs/remotes/trunk:trunk-from-remote &&
git checkout trunk-from-remote

Если вы работаете с настроенным пультом дистанционного управления, вы можете переписать его конфигурацию remote. .fetch и добавить дополнительную запись для автоматизации выборки из оба refs / head / и refs / remotes / .

# fetch branchs of remote into remote-name/heads/*
git config remote.remote-name.fetch '+refs/heads/*:refs/remotes/remote-name/heads/*' &&
# fetch remotes of remote into remote-name/remotes/*
git config --add remote.remote-name.fetch '+refs/remotes/*:refs/remotes/remote-name/remotes/*'

Чтобы избежать возможных коллизий, в приведенном выше примере выборка настраивается для хранения ссылок в непересекающихся пространствах имен (… ​​/ Heads / и … / remotes / ). Вы можете выбрать разные имена, если хотите.Если вы уверены, что конфликтов не будет, вы можете даже поместить их оба прямо в refs / remotes / remote-name / .

12
ответ дан 1 December 2019 в 03:42
поделиться

Хороший вопрос! Я знаю, что это работает; не могу придумать ничего другого, что могло бы прийти в голову:

git fetch origin refs/remotes/trunk
git checkout FETCH_HEAD
# or make a branch to check out
git checkout -b remote-trunk FETCH_HEAD

Между прочим, странно, что эти удаленные ссылки не имеют формы refs / remotes / / < branch-name> ... возможно, я неправильно понял названия, но метод действительно работает.

6
ответ дан 1 December 2019 в 03:42
поделиться

На самом деле, я нашел удовлетворительное решение этой проблемы. Добавление удаленного настраивает refspec для получения и извлечения его локальных головок. Я установил другой пульт, который я вызываю / repo-remotes /, который извлекает удаленные ссылки пульта. Файл .git / config в конечном итоге выглядит так

[remote "repo"]
  url = ssh://git@<hostname>:<port>/repo
  fetch = +refs/heads/*:refs/remotes/repo/*

[remote "repo-remotes"]
  url = ssh://git@<hostname>:<port>/repo
  fetch = +refs/remotes/*:refs/remotes/repo-remotes/*

Я могу сделать это.

$ git fetch repo-remotes
$ git checkout -b remote-trunk --track remotes/repo-remotes/trunk

Который устанавливает локальную ветвь, отслеживающую удаленную ветку / trunk / удаленного репозитория.

3
ответ дан 1 December 2019 в 03:42
поделиться

git.exe checkout --track -b trunk refs/remotes/trunk

-1
ответ дан 1 December 2019 в 03:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: