如果在给定的远程仓库中存在特定分支,我需要对一个子树合并进行操作。问题是远程仓库没有被本地检出,所以我无法使用git branch -r
命令。我只有一个远程地址,类似于https://github.com/project-name/project-name.git
。 有没有一种方法可以通过远程地址列出远程分支?很遗憾我找不到任何有用的东西:(
如果在给定的远程仓库中存在特定分支,我需要对一个子树合并进行操作。问题是远程仓库没有被本地检出,所以我无法使用git branch -r
命令。我只有一个远程地址,类似于https://github.com/project-name/project-name.git
。 有没有一种方法可以通过远程地址列出远程分支?很遗憾我找不到任何有用的东西:(
标签?
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
会与远程服务器交互,这可能是您想要的,也可能不是。
您可以使用git remote add something https://github.com/project-name/project-name.git
将您拥有的存储库添加为远程,然后执行git remote show something
以获取有关远程的所有信息。这需要网络连接,对人类使用非常有用。
或者,执行git fetch something
。这将获取名为something
的远程上的所有分支,并将它们保留在您的本地存储库中。然后,您可以根据需要将它们合并到本地分支中。我建议您选择这条路线,因为如果最终决定必须合并,则需要这样做。
OT:您使用“本地检出”一词表明您是从集中式版本控制系统的角度来处理此问题。当您处理git时,这通常是死路一条。它使用“checkout”等单词的方式与旧系统不同。
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'
我将以上一些答案结合在一个脚本中:
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
git fetch
或git pull
,这已经在Jenkins作业存储库配置中完成。
我通常更喜欢在脚本中使用长格式选项。我可以通过使用git checkout -B
来结合git branch
和git checkout
。这是我最简单的方式。 (※ fish shell)
if test (git ls-remote | grep your-branch-name)
echo exist
else
echo not_exist
end
git ls-remote --heads 2>/dev/null|awk -F 'refs/heads/' '{print $2}'|grep -x "your-branch"|wc -l
如果找到分支“your-branch”,则返回1,否则返回0。
awk
和grep
以及wc
?为什么不只使用awk
完成所有这些操作呢?如果存在大量远程分支,这可能会非常缓慢。 - TrueYgit 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
我需要进一步的要求,根据输入选项获取远程分支的名称,例如master
或main
。
~这是别人的hack,但我不记得从哪里得到它了,在这里分享以帮助其他旅行者。~找到了!https://dev59.com/AMHqa4cB1Zd3GeqPtyqc#68098145,感谢@Eugene Yarmash
如果远程不存在branch1
或branch2
,则以下内容将返回空值;否则,返回给定的某个分支名称。
git branch -l branch1 branch2 | sed 's/^* //'
我用它来为自定义的git函数设置变量,例如:
branch=$(git branch -l master main | sed 's/^* //')