Как мне перечислить все удаленные ссылки?

Недавно я создал PR на GitHub, но некоторые тесты провалились. И локально еще больше тестов не прошло. Поэтому я попытался выяснить, в чем проблема.

И я обнаружил, что Трэвис тестировал репо на другом коммите, которого у меня нет. Ссылка refs/pull/81/merge. Итак, кто-то якобы слил мою ветку в мастера и создал соответствующую ссылку. Это был GitHub или Travis?

И другой вопрос, могу ли я перечислить все ссылки, которые есть у GitHub?

Ответ 1

Я ничего не знаю о самом Трэвисе, но GitHub действительно создает эти refs/pull/number/merge refs. В частности, на основе наблюдения - документация кажется немного скудной, и я всего лишь случайный пользователь GitHub - когда вы нажимаете "новый запрос на pull" в GitHub, GitHub:

  • создает ссылку с именем refs/pull/number/head, чтобы сохранить идентификатор комманды, которую вы просите, чтобы кто-то другой слился для вас;
  • пытается выполнить автоматическое слияние и фиксацию (используя git merge), и если это удастся, создается вторая ссылка с именем refs/pull/number/merge.

Обратите внимание, что это автоматически созданное коммитирование слиянием не находится ни в одной ветки, оно просто имеет тот же номер, что и номер запроса на извлечение, и ссылку, чье имя очевидно из самого запроса pull (просто замените head на merge). Я верю, но не проверял вручную - первый родитель этого слияния - это фиксация наконечника ветки, которую вы запрашиваете у кого-то, "on", когда они выполняют одно и то же слияние, то есть код за кулисами, создающий этот refs/pull/number/merge ссылка (или достаточно близко):

commithash=...                         # the commit ID for the pull-request
mergeinto=$(git rev-parse $branchname) # the branch we are to merge into
prnum=...                              # get next pull request number

# create the pull request itself
git update-ref refs/pull/$prnum/pull $commithash

# create the merge ref, if the merge succeeds
git checkout $mergeinto
if git merge -m "..." refs/pull/$prnum/pull; then
    # merge succeeded: create the merge ref
    git update-ref refs/pull/$prnum/merge HEAD
else
    # automatic merge failed, discard it
    git merge --abort
fi

(эта конкретная последовательность кода беспорядочна с индексом и оставляет head отлаженной, поэтому ее необходимо выполнить с блокировкой хранилища и послеработкой или с использованием временного дерева работ; фактическая последовательность кода вероятно, отличается по ряду причин).

Следовательно:

Итак, кто-то предположительно объединил мою ветку в мастер и создал соответствующий ref. Был ли это GitHub или Travis?

Учитывая, что GitHub будет, Уильям Оккам, предположил бы, что нет необходимости привлекать Трэвиса.: -)

И другой вопрос, могу ли я перечислить все репозитории GitHub repo?

Пока у вас есть доступ:

$ git ls-remote

(при условии, что пульт - это URL-адрес GitHub) будет отображаться все открытые ссылки. Я не видел способ веб-интерфейса для этого, и не нашел его в моем (легком) прочтении документации API GitHub.

Ответ 2

Если вам просто нужен список всех ссылок в вашем репо, вы можете запустить:

git show-ref

Это напечатает <SHA> <NAME> каждого ref в .git/refs/*

Ответ 3

В одном ответе упоминается git ls-remote - хотя в общем случае это работает для моего сценария использования, мне нужно было перечислить, что думает Git о пульте дистанционного управления - например. когда администратор сервера очищает мои устаревшие удаленные репозитории, и я хочу восстановить их, используя мои локальные клоны git.

Чтобы перечислить все известные удаленные ссылки, которые я использовал для использования ls .git/refs/remotes/<name>/ - оказывается, в некоторых случаях этого недостаточно, например, в репозитории git-p4 одна из моих удаленных ссылок была указана только в .git/packed-refs.

Использование git branch -r сработало бы, но вывод не может быть чисто проанализирован и требует поиска нужных удаленных ссылок.

После небольшого копания я использовал git for-each-ref:

git for-each-ref --format="%(refname)" refs/remotes/<name>/

Примечание: git show-refs также может перечислять ссылки, но шаблон привязан к концу полного имени ссылки, и сопоставляются только полные компоненты, поэтому полезно, только если вы знаете, какое имя ветки вы хотите, или перечислить все ссылки и grep их. Я хотел что-то аккуратное, что хорошо вписывается в oneliner.