一次创建所有分支时出错

时间:2018-05-04 18:17:24

标签: bash git

我已创建此bash脚本以立即创建所有分支

#!/bin/bash
git fetch -vp
for b in $(git branch -a | grep remotes | grep -v HEAD)
do
    branchname=${b##*/}
    remote=${b#*/}
    command="git branch --track $branchname $remote"
    echo "$command"
    $($command)
done

但我总是遇到同样的错误:

fatal: 'master' is not a valid branch name.

如果我在没有脚本的情况下运行相同的命令,则它会成功执行。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

  

我已创建此脚本,因为我需要将所有分支机构推送到另一个远程仓库,因此首先我需要从原始存储库创建所有本地分支...

你没有。

您可以使用git fetch中已有的远程跟踪分支。那就像origin/mastergit fetch已经从远程下载了所有提交,Git中的分支只是提交上的标签。甚至是远程分支机构。

您可以从git branch -r获取所有远程跟踪分支的列表,但这些分支来自所有遥控器。只需一个远程使用git ls-remotes --heads <remote>即可获得分支。格式有点搞笑,所以你必须做一些按摩。

$ git ls-remote --heads $REMOTE | cut -f2 | sed -E "s/refs\/heads/$REMOTE/"
origin/80_method_methods
origin/gh-pages
origin/io-all
origin/issue/217
origin/issue/255
origin/master
origin/rewrite_cmd_wrapper

然后你就可以从这些分支机构推出。

虽然想要将所有分支从一个回购推到另一个回购非常奇怪。可能有一种更简单的方法可以解决您尝试解决的任何问题。我怀疑你有an XY Problem

我建议改为询问有关该问题的问题。

答案 1 :(得分:0)

正如@ Schwern的回答中所说,希望&#34;检查所有分支机构&#34;远程仓库的问题可能是一个XY问题,在实践中它是不必要的,因为git fetch $REMOTE足以检索所考虑的仓库的整个历史记录。

然而,建议的命令git ls-remote ...似乎不合适,因为:

  • 需要网络连接
  • 它不显示远程分支列表
  • 它只是查询远程仓库(不依赖于提取的数据),以了解对应于本地分支的提交是否恰好在远程数据库中已知。

为了有效地从给定的遥控器获取所有分支的列表,我建议:

git for-each-ref --format "%(refname:strip=2)" "refs/remotes/$REMOTE/" | grep -v -e '/HEAD$'