如何检查给定远程存储库中是否存在远程分支?

时间:2011-11-22 08:30:14

标签: git

如果特定分支存在于给定的远程存储库中,我需要对其进行子树合并。问题是远程存储库未在本地签出,因此我无法使用git branch -r。我所拥有的只是一个远程地址,类似于https://github.com/project-name/project-name.git。有没有办法只通过远程地址列出远程分支?我找不到任何有用的东西:(

15 个答案:

答案 0 :(得分:90)

$ git ls-remote --heads git@github.com:user/repo.git branch-name

如果找到branch-name,您将获得以下输出:

b523c9000c4df1afbd8371324083fef218669108        refs/heads/branch-name

否则不会发送任何输出。

将其汇总到wc会给您10

$ git ls-remote --heads git@github.com:user/repo.git branch-name | wc -l

或者,您可以在--exit-code上设置git ls-remote标记,如果找不到匹配的引号,将返回退出代码2

答案 1 :(得分:47)

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

答案 2 :(得分:13)

如果要运行 git repo ,您可以在当前文件夹中使用的另一种方式

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

答案 3 :(得分:12)

您也可以使用:

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

返回$的最新提交和值?是0 否则返回&#34;致命:坏sha1引用遥控器/来源/&lt;&gt;&#34;和$的价值?是128

答案 4 :(得分:7)

您可以在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

希望它有所帮助。

答案 5 :(得分: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

如果你想要一个可靠的方式。

如果您想在脚本中使用,并且不想将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运行以来可能需要一段时间。

答案 6 :(得分:4)

然后无需每次手动传递存储库名称。

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来查看有关远程的更多信息。

答案 7 :(得分:3)

这里的所有答案都是特定于Linux shell的,如果您所处的环境不支持此类操作(例如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,您可以简单地使用内置的shell处理语义:

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

答案 8 :(得分:1)

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

或者,执行git fetch something。这将获取名为something的远程数据库上的所有分支,并将它们保存在本地存储库中。然后,您可以将它们合并到您当地的分支机构中。我推荐这条路径,因为如果你最终决定进行合并,那么这就是你需要做的。

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

答案 9 :(得分:1)

你可以尝试

$allfiles = Get-ChildItem -file "C:\folder1"  | Group-Object -Property length
foreach($filegroup in $allfiles)
{
    if ($filegroup.Count -ne 1)
    {
        $fileGroup.Group[1..($fileGroup.Count-1)] | move -Destination 'C:\Files_compared'
    }
}

此处git diff --quiet @{u} @{0} 指的是远程/上游,而@{u}指的是当前的本地HEAD(使用较新版本的git,@{0}可以缩短为@{0})。如果遥控器不存在,则会出错。

使用git 2.16.2(我不确定哪个版本是第一个拥有此功能的版本,例如,git 1.7.1没有它),你可以做到

@

如果存在远程分支,则会有一些输出,例如

git checkout

否则没有输出。

答案 10 :(得分: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作为分支名称,它可以正常工作。

答案 11 :(得分:0)

我刚试过这个:

Picasso.with(mContext).load(imageFile).into(ImageView);

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

答案 12 :(得分:0)

我在脚本中结合了上面的一些答案:

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作业中使用它,这就是为什么您看不到Jenkins作业存储库配置中已经完成的任何git fetchgit pull的原因。

我通常更喜欢脚本中的长格式选项。我可以通过使用git branch来组合git checkoutgit checkout -B

答案 13 :(得分:0)

怎么样

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

答案 14 :(得分:-1)

将返回名称中包含查询的所有分支(远程或本地)。

git branch --all | grep <query>