Мне нужно выполнить слияние поддерева для конкретной ветки, если она существует в данном удаленном репозитории. Проблема в том, что удаленный репозиторий не извлечен локально, поэтому я не могу его использовать git branch -r
. Все, что у меня есть, это удаленный адрес, что-то вроде этого https://github.com/project-name/project-name.git
. Есть ли способ перечислить удаленные ветки только по удаленному адресу? Ничего полезного не нашел :(
106
git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/null
followed byif [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi
/refs/heads/branch-name
. В противном случае ветвьfoo/branch-name
будет возвращена, даже если нетbranch-name
.git ls-remote --heads origin branch-name
источник
git ls-remote --exit-code . origin/branch-name &> /dev/null
затем использовал$?
в качестве тестового операндаif git ls-remote ...; then ...; fi
менее подвержен ошибкам, чем проверка$?
(которую можно изменить с помощью операторов регистрации, ловушек и т. Д.).--heads
?--heads
перечисляет только ветки. используйте только--tags
для перечисления тегов.Другой способ, который вы можете использовать в текущей папке, если это репозиторий git для запуска
источник
git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
git branch -a | grep "\b${BRANCH}$"
git fetch
требуется при использовании,git branch -a
поэтому сначала выбираются все ссылки на удаленные устройства. Другое использование,git ls-remote
как указано другими.git branch -a --list '<pattern>'
тоже вариант. Вернитесь к grep, если вам нужен код возврата для вашего скрипта.Вы также можете использовать это:
возвращает последнюю фиксацию и значение $? равно 0, в противном случае возвращается "fatal: bad sha1 reference remotes / origin / <>" и значение $? 128
источник
Все ответы здесь относятся к оболочке 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
.источник
Вы можете сделать что-то подобное в терминале Bash. Просто замените эхо на команды, которые вы хотите выполнить.
Надеюсь, поможет.
источник
Тогда не нужно каждый раз вручную передавать имя репозитория.
Вместо того
Пример :
ИЛИ
Оба дадут одинаковый результат:
Подробнее об Origin : Git использует понятие «удаленных», которые представляют собой просто URL-адреса других копий вашего репозитория. Когда вы клонируете другой репозиторий, Git автоматически создает удаленный объект с именем «origin» и указывает на него. Вы можете увидеть дополнительную информацию об пульте дистанционного управления, набрав git remote show origin.
источник
работает большую часть времени.
Но не будет работать, если ветка частично совпадает, как показано ниже,
Использовать
если хотите надежный способ.
Если вы хотите использовать скрипт и не хотите использовать его
origin
как удаленный по умолчанию, тогдадолжно сработать.
Обратите внимание, что
git branch -a | grep ...
это ненадежно, так как с момента последнегоfetch
запуска может пройти некоторое время .источник
grep -x "$branch"
идентичноgrep ^"$branch"$
). Хотя в сценариях я предпочитаю долго-форма переходит:--line-regexp
. Кроме того, в этом нет необходимостиwc -l
. Помещение пустого вывода в Bashif [ -z ]
эффективно оценивается как истинное, поэтому это означает, что ветка не существует. Это сэкономит вам несколько миллисекунд.Вы можете добавить репозиторий, который у вас есть как удаленный,
git remote add something https://github.com/project-name/project-name.git
а затем выполнитьgit remote show something
чтобы получить всю информацию о пульте. Это требует подключения к сети и полезно для использования человеком.В качестве альтернативы выполните файл
git fetch something
. Это приведет к извлечению всех веток на вызываемом удаленном компьютереsomething
и сохранит их в вашем локальном репозитории. Затем вы можете объединить их в свой локальный филиал по своему усмотрению. Я рекомендую этот путь, поскольку, если вы наконец решите, что вам нужно выполнить слияние, это то, что вам нужно сделать.ОТ: Использование вами выражения «извлечено локально» указывает на то, что вы подходите к этому с точки зрения централизованной системы контроля версий. Обычно это тупик, когда вы имеете дело с git. В нем используются такие слова, как «касса» и т. Д., Иначе, чем в старых системах.
источник
Можешь попробовать
Здесь
@{u}
относится к удаленному / восходящему потоку и@{0}
относится к текущему локальному HEAD (с более новой версией git@{0}
может быть сокращено как@
). Если пульт не существует, он выдает ошибку.С git 2.16.2 (я не уверен, какая версия первой имеет эту функциональность, например, git 1.7.1 не имеет ее), вы можете сделать
Если существует удаленная ветка, будет какой-то вывод, например
В противном случае нет вывода.
источник
Вернет все ветки (удаленные или локальные), содержащие запрос в имени.
git branch --all | grep <query>
источник
Если имена ваших веток очень специфичны, вам может не понадобиться использовать grep для простого сопоставления имен веток:
который работает для
Мы используем уникальный идентификатор проблемы в качестве имен веток, и он отлично работает.
источник
Я только что попробовал:
Это вернет 1, если будет найдена ветка «your-branch», и 0 в противном случае.
источник
Я комбинирую некоторые из приведенных выше ответов в сценарии:
Этот скрипт получит 4 ветки из удаленного битбакета и отправит их на удаленный github, а затем отправит все теги в github. Я использую это в работе Дженкинс, поэтому вы не видите какой - либо
git fetch
илиgit pull
, это уже сделано в конфигурации репозитория заданий Jenkins.Я обычно предпочитаю длинные варианты в скриптах. Я мог бы совместить
git branch
иgit checkout
с помощьюgit checkout -B
.источник