git checkout -b <name> <remote>/<branch>
似乎需要一个命名的遥控器。有没有办法让它只在一个URL下工作?原因是团队中的人员有不同的遥控器名称(例如gitlab
和origin
vs origin
和github
),我想忽略其中的差异一个剧本。
一种可能性是在脚本开头给远程名称并最后删除它,但我宁愿避免使用它。
答案 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