可以使用远程URL而不是名称来检查分支吗?

时间:2015-08-12 14:43:48

标签: git

git checkout -b <name> <remote>/<branch>似乎需要一个命名的遥控器。有没有办法让它只在一个URL下工作?原因是团队中的人员有不同的遥控器名称(例如gitlaborigin vs origingithub),我想忽略其中的差异一个剧本。

一种可能性是在脚本开头给远程名称并最后删除它,但我宁愿避免使用它。

4 个答案:

答案 0 :(得分:3)

没有办法让git checkout -b的第二个参数使用URL而不是分支的名称(以<remote>/<branch>或其他形式)。

从手册页:

   git checkout -b|-B <new_branch> [<start point>]
       Specifying -b causes a new branch to be created as if git-branch(1) were
       called and then checked out. In this case you can use the --track or
       --no-track options, which will be passed to git branch. As a convenience,
       --track without -b implies branch creation; see the description of
       --track below.

       If -B is given, <new_branch> is created if it doesn’t exist; otherwise,
       it is reset. This is the transactional equivalent of

           $ git branch -f <branch> [<start point>]
           $ git checkout <branch>

       that is to say, the branch is not reset/created unless "git checkout" is
       successful.

git branch的第二个参数start point需要指向现有仓库中的提交。通过URL寻址的分支(可能甚至没有获取)将无法实现此目的。此外,没有办法将分支编码为git URL作为标准(github可能有东西,但我认为没有,否则golang导入会更容易......)

如果你想做这项工作,你需要:

  • 解析git remote -v show的输出以获取适当的远程名称
  • 执行git fetch以确保相关分支被拉下(git fetch --all可能是您的朋友)
  • 将分支名称附加到远程名称,并将git checkout -b附加到。

这是一个非常轻微测试的bash脚本:

#!/bin/bash
#
# usage: scriptname repo branchname
#
# where repo is the URL, branchname is the branchname to create
repo="$1"
branchname="$2"
remote=$(git remote -v show | perl -n -e 'if (m,^(\w+)\s+(\S+)\b, && $2 eq '"'${repo}'"') {print "$1\n" ; exit 0}')
if [ "$remote" == "" ] ; then
    echo cannot find "${repo}" 1>&2
    exit 1
fi
git fetch --all && git checkout -b "${branchname}" "remotes/${remote}/${branchname}"

答案 1 :(得分:2)

例如,在repo根目录中运行git remote可以得到如下内容:

$ git remote
foobar
origin

您可以解析它并将其合并到您的脚本中。

答案 2 :(得分:2)

一种可能性(如其他人所建议的)是获取远程用户名的URL

REMOTE_URL=git@github.com:foo/bar.git
REMOTE_NAME=git remote -v show | grep $REMOTE_URL | awk '{print $1}'
git checkout -b <name> $REMOTE_NAME/<branch>

另外,如果您有幸拥有分支的唯一名称,则可以直接执行

git checkout -b <name> <branch>

并且git会自动选择包含该分支的遥控器。

答案 3 :(得分:1)

可以这样做,但不能单独使用git checkout。 Gerrit使用以下命令让所有人签出任何分支(它使用一些特殊的引用,但其余的仍然适用):

git fetch <url> branch && git checkout -b name FETCH_HEAD