Мне клонировали локальный репозиторий из пустого удаленного репозитория. Следующие списки команд 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
Вы можете получить любую ссылку с любого пульта дистанционного управления (если сервер готов предоставить ее вам). Ключом к получению ссылок за пределами 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.
и добавить дополнительную запись для автоматизации выборки из оба 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 /
.
Хороший вопрос! Я знаю, что это работает; не могу придумать ничего другого, что могло бы прийти в голову:
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 /
... возможно, я неправильно понял названия, но метод действительно работает.
На самом деле, я нашел удовлетворительное решение этой проблемы. Добавление удаленного настраивает 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 / удаленного репозитория.
git.exe checkout --track -b trunk refs/remotes/trunk