Как проверить, существует ли удаленная ветвь в данном удаленном хранилище? - PullRequest
81 голосов
/ 22 ноября 2011

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

Ответы [ 14 ]

97 голосов
/ 29 мая 2015
$ 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 в случае, если не найдено соответствующих ссылок.

48 голосов
/ 22 ноября 2011
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
13 голосов
/ 19 февраля 2016

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

git branch -a | egrep 'remotes/origin/${YOUR_BRANCH_NAME}$'
12 голосов
/ 04 августа 2017

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

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

возвращает последний коммит и значение $?0 в противном случае возвращает «fatal: bad sha1 reference remotes / origin / <>» и значение $?128

7 голосов
/ 17 февраля 2014

Вы можете сделать что-то подобное в терминале 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

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

6 голосов
/ 07 июня 2017
$ 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.

5 голосов
/ 27 декабря 2018

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

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

OR

git ls-remote origin uat_21dec

Оба будут давать одинаковый вывод:

enter image description here

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

3 голосов
/ 05 февраля 2019

Все ответы здесь зависят от оболочки 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.

1 голос
/ 02 марта 2018

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

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'

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

1 голос
/ 22 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...