【问题标题】:Error when creating all branches at once一次创建所有分支时出错
【发布时间】:2018-10-15 07:10:26
【问题描述】:

我创建了这个 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.

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

我做错了什么?

【问题讨论】:

标签: bash git


【解决方案1】:

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

你没有。

您可以使用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

然后你可以从那些分支推送。


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

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

【讨论】:

    【解决方案2】:

    正如@Schwern 的回答中很好解释的那样,想要“检查远程仓库的所有分支”可能是一个 XY 问题,在实践中是不需要的,因为git fetch $REMOTE 足以检索所考虑的整个历史记录回购。

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

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

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

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

    【讨论】:

    • 我想知道为什么ls-remote 这么慢,谢谢!在这种情况下没关系,因为 1) OP 已经在执行 git fetch 并且需要 git push 所以我们可以假设网络连接。 2 和 3 是 XY 问题的一部分。奇怪的是git branch -r 没有带遥控器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多