如果特定分支存在于给定的远程存储库中,我需要对其进行子树合并。问题是远程存储库未在本地签出,因此我无法使用git branch -r
。我所拥有的只是一个远程地址,类似于https://github.com/project-name/project-name.git
。有没有办法只通过远程地址列出远程分支?我找不到任何有用的东西:(
答案 0 :(得分:90)
$ 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
。
答案 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
两者都会给出相同的输出:
更多有关起源的信息: 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 fetch
或git pull
的原因。
我通常更喜欢脚本中的长格式选项。我可以通过使用git branch
来组合git checkout
和git 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>