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

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

$ git ls-remote <remote>

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

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

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

$ git branch -a

master
remotes/test
remotes/trunk

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

$ git branch -r

repo/HEAD -> repo/master
repo/master

Ответы

Ответ 1

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

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

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


Извлеките репозитории 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.<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/*'

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

Ответ 2

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

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

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

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

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

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

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

Что настраивает локальную ветвь отслеживания удаленной ветки/соединительной линии удаленного репозитория/.

Ответ 4

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