Как проверить, существует ли удаленная ветвь в данном удаленном репозитории?

Мне нужно выполнить слияние поддерева для определенной ветки, если оно существует в данном удаленном репозитории. Проблема в том, что удаленный репозиторий не проверяется локально, поэтому я не могу использовать git branch -r. Все, что у меня есть, - это удаленный адрес, что-то вроде https://github.com/project-name/project-name.git. Есть ли способ перечислить удаленные ветки только удаленным адресом? Я не нашел ничего полезного: (

Ответ 1

$ git ls-remote --heads [email protected]:user/repo.git branch-name

Если branch-name найдено, вы получите следующий вывод:

b523c9000c4df1afbd8371324083fef218669108        refs/heads/branch-name

В противном случае выходные данные не будут отправлены.

Таким образом, передача его в wc даст вам 1 или 0:

$ git ls-remote --heads [email protected]:user/repo.git branch-name | wc -l

В качестве альтернативы вы можете установить --exit-code на git ls-remote который будет возвращать код выхода 2 если не найдено соответствующих ссылок.

Ответ 2

git ls-remote --heads https://github.com/rails/rails.git
5b3f7563ae1b4a7160fda7fe34240d40c5777dcd    refs/heads/1-2-stable
81d828a14c82b882e31612431a56f830bdc1076f    refs/heads/2-0-stable
b5d759fd2848146f7ee7a4c1b1a4be39e2f1a2bc    refs/heads/2-1-stable
c6cb5a5ab00ac9e857e5b2757d2bce6a5ad14b32    refs/heads/2-2-stable
e0774e47302a907319ed974ccf59b8b54d32bbde    refs/heads/2-3-stable
13ad87971cc16ebc5c286b484821e2cb0fc3e3b1    refs/heads/3-0-stable
3df6c73f9edb3a99f0d51d827ef13a439f31743a    refs/heads/3-1-stable
f4db3d72ea564c77d5a689b850751ce510500585    refs/heads/compressor
c5a809e29e9213102351def7e791c3a8a67d7371    refs/heads/deps_refactor
821e15e5f2d9ef2aa43918a16cbd00f40c221e95    refs/heads/encoding
8f57bf207ff4f28fa8da4544ebc573007b65439d    refs/heads/master
c796d695909c8632b4074b7af69a1ef46c68289a    refs/heads/sass-cleanup
afd7140b66e7cb32e1be58d9e44489e6bcbde0dc    refs/heads/serializers

Ответ 3

Другой способ, который вы можете использовать в текущей папке, если это git repo для запуска

git branch -a | egrep 'remotes/origin/${YOUR_BRANCH_NAME}$'

Ответ 4

Вы также можете использовать это:

git show-branch remotes/origin/<<remote-branch-name>>

возвращает последнюю фиксацию и значение $? 0 в противном случае возвращает "фатальные: неправильные sha1 ссылки remotes/origin/< > " и значение $? составляет 128

Ответ 5

Вы можете сделать что-то подобное в терминале Bash. Просто замените эхо с помощью команд, которые вы хотите выполнить.

if git ls-remote https://username:[email protected]/project-name/project-name.git | grep -sw "remote_branch_name" 2>&1>/dev/null; then echo "IT EXISTS..START MERGE" ; else echo "NOT FOUND" ; fi

Надеюсь, что это поможет.

Ответ 6

$ git ls-remote --heads origin <branch> | wc -l

работает большую часть времени.

Но не будет работать, если ветвь совпадает, как показано ниже,

$ git branch -a
creative/dev
qa/dev

$ git ls-remote --heads origin dev | wc -l
2

Использование

git ls-remote --heads origin <branch> | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    grep ^<branch>$ | wc -l

если вы хотите надежный способ.

Если вы хотите использовать в script и не хотите принимать origin как удаленный по умолчанию, тогда

git ls-remote --heads $(git remote | head -1) "$branch" | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    grep ^"$branch"$ | wc -l

должен работать.

Обратите внимание, что git branch -a | grep ... не является надежным, так как это может быть некоторое время с момента выполнения последнего fetch.

Ответ 7

Тогда нет необходимости каждый раз вручную передавать имя хранилища.

git ls-remote origin <branch>

Вместо

git ls-remote <full repo url> <branch>

Пример:

git ls-remote [email protected]:landmarkgroupme/in-store-application.git  uat_21dec

ИЛИ ЖЕ

git ls-remote origin uat_21dec

Оба будут давать одинаковый результат:

enter image description here

Подробнее о происхождении: Git имеет понятие "удаленные", которые являются просто URL-адресами других копий вашего хранилища. Когда вы клонируете другой репозиторий, Git автоматически создает удаленный сервер с именем "origin" и указывает на него. Вы можете увидеть больше информации о пульте, набрав git remote show origin.

Ответ 8

Все ответы здесь зависят от оболочки Linux, что не очень помогает, если вы находитесь в среде, которая не поддерживает такие операции - например, командная строка Windows.

К счастью, git ls-remote принимает аргумент --exit-code который возвращает 0 или 2 в зависимости от того, существует ветвь или нет, соответственно. Так:

git ls-remote --exit-code --heads origin <branch-that-exists-in-origin>

вернет 0, и

git ls-remote --exit-code --heads origin <branch-that-only-exists-locally>

вернется 2.

Для PowerShell вы можете просто использовать встроенную семантику обработки оболочки:

if (git ls-remote --heads origin <branch-that-exists-in-origin>) { $true } else { $false }

дает $true, тогда как:

if (git ls-remote --heads origin <branch-that-only-exists-locally>) { $true } else { $false }

дает $false.

Ответ 9

Вы можете добавить репозиторий, который вы используете как удаленный, с помощью git remote add something https://github.com/project-name/project-name.git, а затем выполните git remote show something, чтобы получить всю информацию о пульте дистанционного управления. Для этого требуется подключение к сети и полезно для использования человеком.

В качестве альтернативы сделайте a git fetch something. Это приведет к извлечению всех ветвей на удаленном сервере под названием something и сохранит их в локальном репозитории. Затем вы можете объединить их в свой филиал, как вам будет угодно. Я рекомендую этот путь, поскольку, если вы, наконец, решите, что вам нужно объединиться, это то, что вам нужно сделать.

OT: Ваше использование "проверено локально" означает, что вы приближаетесь к этому с точки зрения централизованной системы контроля версий. Обычно это тупик, когда вы имеете дело с git. Он использует такие слова, как "checkout" и т.д., В отличие от старых систем.

Ответ 10

Ты можешь попробовать

git diff --quiet @{u} @{0}

Здесь @{u} относится к удаленному/восходящему потоку, а @{0} относится к текущему локальному HEAD (в более новой версии git @{0} может быть сокращено до @). Если удаленный не существует, он выдает ошибки.

С git 2.16.2 (я не уверен, какая версия первой обладает такой функциональностью, например, git 1.7.1 ее не имеет), вы можете сделать

git checkout

Если существует удаленная ветвь, будет вывод, например

Your branch is up to date with 'origin/master'

В противном случае нет выхода.

Ответ 11

Если имена ваших веток очень специфичны, вам может не понадобиться использовать grep для простого сопоставления имени ветки:

git ls-remote --heads $(git remote | head -1) "*${BRANCH_NAME}*" | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    wc -l

который работает для

BRANCH=master
BRANCH=mas
BRANCH=NonExistingBranch (returns 0)
BRANCH=ISSUE-123

Мы используем уникальный идентификатор проблемы как имена ветвей, и он отлично работает.

Ответ 12

Я только что попробовал это:

git ls-remote --heads 2>/dev/null|awk -F 'refs/heads/' '{print $2}'|grep -x "your-branch"|wc -l

Это вернет 1, если найдена ветка "your-branch", и 0 в противном случае.

Ответ 13

Я комбинирую некоторые ответы выше в сценарии:

BRANCHES=(develop master 7.0 7.0-master)
ORIGIN=bitbucket
REMOTE=github

for BRANCH in "${BRANCHES[@]}"; do
  BRANCH=$(git ls-remote --heads "${ORIGIN}" "${BRANCH}" \
      | cut --delimiter=$'\t' --fields=2 \
      | sed 's,refs/heads/,,' \
      | grep --line-regexp "${BRANCH}")
  if [ -n "${BRANCH}" ]
  then
    git branch --force "${BRANCH}" "${ORIGIN}"/"${BRANCH}"
    git checkout "${BRANCH}"
    git push "${REMOTE}" "${BRANCH}"
  fi
done

git push github --tags

Этот скрипт получит 4 ветки из удаленного битбакета и отправит их на удаленный github, а затем отправит все теги в github. Я использую это в задании Jenkins, поэтому вы не видите git fetch или git pull, что уже сделано в конфигурации хранилища заданий Jenkins.

Я обычно предпочитаю варианты длинных форм в скриптах. Я мог бы объединить git branch и git checkout с помощью git checkout -B.

Ответ 14

Вернет все ветки (удаленные или локальные), которые содержат запрос в имени.

git branch --all | grep <query>