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

如果某个特定分支存在于给定的远程存储库中,我需要为它执行子树合并操作。问题是远程存储库没有在本地签出,所以我不能使用 git branch -r。我只有一个远程地址,像这样的 https://github.com/project-name/project-name.git。有没有一种方法可以仅仅通过一个远程地址来列出远程分支?我找不到任何有用的东西:

132373 次浏览
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

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

或者,做一个 git fetch something。这将获取远程 something上的所有分支,并将它们保存在本地存储库中。然后,您可以根据自己的喜好将它们合并到本地分支中。我推荐这条路径,因为如果您最终决定将 合并,这就是您需要做的。

OT: 您使用“签出本地”表明您正在从一个集中的版本控制系统的角度来处理这个问题。对付 Git 通常是死路一条。它使用“签出”等词语的方式与旧系统不同。

您可以在 Bash 终端中执行类似的操作。只需用要执行的命令替换 echo 即可。

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 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

或者,您可以在 git ls-remote上设置 --exit-code标志,如果没有找到匹配的参考文献,它将返回退出代码 2。可以在 shell 测试中直接检查结果,也可以通过检查状态变量 $?来检查结果。

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

如果要运行的是 回收,则可以在当前文件夹中使用另一种方法

git branch -a | egrep 'remotes/origin/${YOUR_BRANCH_NAME}$'
$ 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 show-branch remotes/origin/<<remote-branch-name>>

返回最新提交,值为 $? 为0 否则,返回“足以致命的: bad sha1引用 Remotes/source/< >”,并且 $? 的值为128

如果您的分支名称非常特定,那么您可能不需要使用 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 作为分支名称,它工作得很好。

我刚试过这个:

git ls-remote --heads 2>/dev/null|awk -F 'refs/heads/' '{print $2}'|grep -x "your-branch"|wc -l

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

你可以试试

git diff --quiet @{u} @{0}

在这里,@{u}指的是远程/上游,而 @{0}指的是当前的本地 HEAD (使用较新版本的 git,@{0}可以缩写为 @)。如果远程不存在,它就会出错。

使用 git2.16.2(我不确定哪个版本是第一个拥有这个功能的版本,例如,git1.7.1没有这个功能) ,您可以这样做

git checkout

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

Your branch is up to date with 'origin/master'

否则就没有输出。

这样就不需要每次都手动传递存储库名称。

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

两者都将产生相同的结果:

enter image description here

更多关于起源的资料 : Git 有“ Remotes”的概念,它只是存储库其他副本的 URL。当您克隆另一个存储库时,Git 会自动创建一个名为“ source”的远程存储库并指向它。通过键入 git remote show source,您可以查看有关远程的更多信息。

我将上面的一些答案组合在一个脚本中:

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 checkout -B组合 git branchgit checkout

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

git branch --all | grep <query>

这里的所有答案都是特定于 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,您可以简单地使用内置的真实性处理语义:

如果(git ls-remote ——头原点 < Branch-that-vis-in-source >){ $true } else { $false }

收益率为 $true,同时:

If (git ls-remote —— head source < Branch-that-only-vis-local >){ $true } else { $false }

收益率为 $false

公正怎么样

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将与远程服务器交互 也许是你想要的,也许不是。

这对我来说是最简单的方法。(※鱼壳)

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

我需要进一步的需求来获得远程分支的名称,给定输入选项,例如 mastermain

这是别人的黑客,但我不记得我从哪里得到它,在这里分享,以防它帮助另一个旅行者。找到了!https://stackoverflow.com/a/68098145谢谢 致@Eugene Yarmash

如果远程程序上既没有现存的 branch1也没有现存的 branch2,否则下面的代码将不返回任何内容。

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

我使用它为自定义 git 函数设置变量,例如。

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

下面是一个简单的 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