Как проверить, существует ли удаленная ветвь в данном удаленном хранилище?
Мне нужно выполнить слияние поддеревьев для конкретной ветви, если она существует в данном удаленном хранилище. Проблема в том, что удаленный репозиторий не проверяется локально, поэтому я не могу использовать git branch -r
, Все, что у меня есть, это удаленный адрес, что-то вроде этого https://github.com/project-name/project-name.git
, Есть ли способ перечислить удаленные ветви только по удаленному адресу? Я не смог найти ничего полезного:(
18 ответов
$ git ls-remote --heads git@github.com:user/repo.git branch-name
В случае branch-name
найден, вы получите следующий вывод:
b523c9000c4df1afbd8371324083fef218669108 refs/heads/branch-name
В противном случае выходные данные не будут отправлены.
Так что это wc
дам тебе 1
или же 0
:
$ git ls-remote --heads git@github.com:user/repo.git branch-name | wc -l
В качестве альтернативы вы можете установить --exit-code
флаг на git ls-remote
который вернет код выхода 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
Все ответы здесь зависят от оболочки 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
,
Вы также можете использовать это:
git show-branch remotes/origin/<<remote-branch-name>>
возвращает последний коммит и значение $? 0 в противном случае возвращает "fatal: bad sha1 reference remotes/origin/<>" и значение $? это 128
Тогда нет необходимости каждый раз вручную передавать имя хранилища.
git ls-remote origin <branch>
Вместо
git ls-remote <full repo url> <branch>
Пример:
git ls-remote git@bitbucket.org:landmarkgroupme/in-store-application.git uat_21dec
ИЛИ ЖЕ
git ls-remote origin uat_21dec
Оба будут давать одинаковый результат:
Подробнее о происхождении: Git имеет понятие "удаленные", которые являются просто URL-адресами других копий вашего хранилища. Когда вы клонируете другой репозиторий, Git автоматически создает удаленный сервер с именем "origin" и указывает на него. Вы можете увидеть больше информации о пульте, набрав git remote show origin .
Другой способ, которым вы можете использовать в текущей папке, если это git-репо для запуска
git branch -a | egrep 'remotes/origin/${YOUR_BRANCH_NAME}$'
Вы можете сделать что-то подобное в терминале Bash. Просто замените эхо командами, которые вы хотите выполнить.
if git ls-remote https://username:password@github.com/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
Надеюсь, поможет.
$ 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
если вы хотите надежный способ.
Если вы хотите использовать в сценарии и не хотите предполагать 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
был запущен.
Вернет все ветви (удаленные или локальные), которые содержат запрос в имени.
git branch --all | grep <query>
Вот простойbash
скрипт который делает работу
#!/bin/bash
BRANCH="your-branch-name"
# Replace above value with the URL of your git repository
REPO_URL="https://github.com/lsst-dm/qserv-ingest.git"
if git ls-remote --exit-code --heads "$REPO_URL" "$BRANCH"
then
echo "REMOTE BRANCH EXISTS"
else
echo "REMOTE BRANCH NOT FOUND"
fi
Как насчет просто
if [ -e .git/refs/remotes/origin/mybranch ]; then
echo remote branch still exists - locally at least
else
echo remote branch is gone
fi
git ls-remote
будет взаимодействовать с удаленным сервером, что может быть, а может и не быть тем, что вам нужно.
Я комбинирую некоторые из ответов выше в сценарии:
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 ветки из удаленного bitbucket и отправит их на удаленный github, а затем отправит все теги в github. Я использую это в работе Дженкинса, поэтому вы не видите ничего git fetch
или же git pull
, это уже сделано в конфиге репозитория заданий Jenkins.
Я обычно предпочитаю варианты длинных форм в скриптах. Я мог бы объединить git branch
а также git checkout
используя git checkout -B
,
Ты можешь попробовать
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'
В противном случае нет выхода.
Вы можете добавить свой репозиторий как удаленный, используя git remote add something https://github.com/project-name/project-name.git
а затем сделать git remote show something
чтобы получить всю информацию о пульте. Это требует подключения к сети и полезно для использования человеком.
В качестве альтернативы, сделать git fetch something
, Это выберет все ветви на удаленном something
и держите их в своем локальном хранилище. Затем вы можете объединить их в своем местном отделении, как вам угодно. Я рекомендую этот путь, поскольку, если вы наконец решите, что должны объединиться, это то, что вам нужно сделать.
ОТ: Ваше использование "проверено локально" означает, что вы подходите к этому с точки зрения централизованной системы контроля версий. Обычно это тупик, когда ты имеешь дело с мерзавцем. Он использует такие слова, как "оформить заказ" и т. Д., В отличие от старых систем.
Для меня это самый простой способ. (※ рыбная раковина)
if test (git ls-remote | grep your-branch-name)
echo exist
else
echo not_exist
end
Мне нужно было дополнительное требование, чтобы получить имя удаленной ветки с учетом параметров ввода, например
master
или же
main
.
~Это чей-то лайфхак, но я не могу вспомнить, откуда я его взял, делюсь здесь на случай, если он поможет другому путешественнику.~ Нашел! /questions/58135059/kak-uznat-kakaya-iz-osnovnyih-ili-osnovnyih-vetok-suschestvuet-v-repozitorii/58161421#58161421, спасибо @Евгений Ярмаш
Следующее ничего не вернет, если ни
branch1
или же
branch2
существует на удаленном компьютере, а в противном случае — одно из заданных имен веток.
git branch -l branch1 branch2 | sed 's/^* //'
Я использую его для установки переменных для пользовательских функций git, например
branch=$(git branch -l master main | sed 's/^* //')
Если ваши имена веток очень специфичны, вам может не понадобиться использовать 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
Мы используем уникальный идентификатор проблемы в качестве имени ветви, и он работает нормально.
Я только что попробовал это:
git ls-remote --heads 2>/dev/null|awk -F 'refs/heads/' '{print $2}'|grep -x "your-branch"|wc -l
Это вернет 1, если найдена ветка "your-branch", и 0 в противном случае.