如何检查给定的远程仓库上是否存在远程分支?

180

如果在给定的远程仓库中存在特定分支,我需要对一个子树合并进行操作。问题是远程仓库没有被本地检出,所以我无法使用git branch -r命令。我只有一个远程地址,类似于https://github.com/project-name/project-name.git。 有没有一种方法可以通过远程地址列出远程分支?很遗憾我找不到任何有用的东西:(

18个回答

2
如何只使用

标签?

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 会与远程服务器交互,这可能是您想要的,也可能不是。


1
这在新克隆中不起作用。 - piecia

1

您可以使用git remote add something https://github.com/project-name/project-name.git将您拥有的存储库添加为远程,然后执行git remote show something以获取有关远程的所有信息。这需要网络连接,对人类使用非常有用。

或者,执行git fetch something。这将获取名为something的远程上的所有分支,并将它们保留在您的本地存储库中。然后,您可以根据需要将它们合并到本地分支中。我建议您选择这条路线,因为如果最终决定必须合并,则需要这样做。

OT:您使用“本地检出”一词表明您是从集中式版本控制系统的角度来处理此问题。当您处理git时,这通常是死路一条。它使用“checkout”等单词的方式与旧系统不同。


谢谢你的解释。我还没有习惯使用 Git,它需要不同的思维方式。 - Keen

1
你可以尝试

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

我将以上一些答案结合在一个脚本中:

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

这个脚本将从远程bitbucket获取4个分支,并将它们推送到远程github,然后将所有标签推送到github。 我在Jenkins工作中使用这个脚本,所以你看不到任何git fetchgit pull,这已经在Jenkins作业存储库配置中完成。 我通常更喜欢在脚本中使用长格式选项。我可以通过使用git checkout -B来结合git branchgit checkout

0

这是我最简单的方式。 (※ fish shell)

if test (git ls-remote | grep your-branch-name)
  echo exist
else
  echo not_exist
end

0
我刚刚尝试了这个:
git ls-remote --heads 2>/dev/null|awk -F 'refs/heads/' '{print $2}'|grep -x "your-branch"|wc -l

如果找到分支“your-branch”,则返回1,否则返回0。


真的吗?awkgrep以及wc?为什么不只使用awk完成所有这些操作呢?如果存在大量远程分支,这可能会非常缓慢。 - TrueY

0
如果你的分支名称非常具体,你可能不需要使用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

我们使用唯一的问题ID作为分支名称,这样可以正常工作。

0

我需要进一步的要求,根据输入选项获取远程分支的名称,例如mastermain

~这是别人的hack,但我不记得从哪里得到它了,在这里分享以帮助其他旅行者。~找到了!https://dev59.com/AMHqa4cB1Zd3GeqPtyqc#68098145,感谢@Eugene Yarmash

如果远程不存在branch1branch2,则以下内容将返回空值;否则,返回给定的某个分支名称。

git branch -l branch1 branch2 | sed 's/^* //'

我用它来为自定义的git函数设置变量,例如:

branch=$(git branch -l master main | sed 's/^* //')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接