В git, как проверить удаленные ветви удаленного репозитория? - PullRequest
13 голосов
/ 14 июня 2010

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

$ git ls-remote <remote>

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

Я хочу оформить заказ и отследить удаленную ветку этого пульта Магистраль . Как мне это сделать?

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

$ git branch -a

master
remotes/test
remotes/trunk

После запуска git fetch для извлечения всех веток удаленного репозитория я получаю этот вывод в локальном репозитории.

$ git branch -r

repo/HEAD -> repo/master
repo/master

Ответы [ 4 ]

11 голосов
/ 14 июня 2010

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

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

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


Извлеките refs/remote/trunk хранилища в FETCH_HEAD и отметьте его как отдельную ГОЛОВУ:

git fetch remote-name-or-url refs/remotes/trunk &&
git checkout FETCH_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.<remote-name>.fetch и добавить дополнительную запись для автоматизации выборки из refs/heads/ и 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/*'

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

6 голосов
/ 14 июня 2010

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

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/<remote-name>/<branch-name> ... возможно, я неправильно понял имена, но метод работает.

3 голосов
/ 14 июня 2010

На самом деле, я нашел удовлетворительное решение для этого. Добавление удаленного настроит 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/.

0 голосов
/ 14 июня 2010

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

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