我在GitHub上远程追踪我的master
和development
分支。我该如何同时克隆这两个分支呢?
当没有指定时,Git通常会从一个或多个其他存储库中获取所有分支和/或标签(引用,请参见:git ls-refs
),以及完成它们的历史记录所需的对象。换句话说,它会提取已经下载的对象可以到达的对象。请参见:What does git fetch
really do?
有时你可能有一些与当前分支没有直接联系的分支/标签,这时git pull --all
/git fetch --all
将不起作用,但你可以通过以下方式列出它们:
git ls-remote -h -t origin
通过知道引用名称手动获取它们。
因此,要全部获取,请尝试:
git fetch origin --depth=10000 $(git ls-remote -h -t origin)
--depth=10000
参数可以帮助你在浅层存储库中找到更多内容。
然后再次检查所有分支:
git branch -avv
$ git remote -v show origin
...
Remote branches:
master tracked
通过 git remote set-branches
命令设置分支:
git remote set-branches --add origin missing_branch
因此,在获取后,它可能会出现在remotes/origin
下:
$ git remote -v show origin
...
Remote branches:
missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
* [new branch] missing_branch -> origin/missing_branch
如果您仍然无法获取除主分支以外的内容,请检查以下内容:
git remote -v
),例如:
git config branch.master.remote
是否为 origin
。git remote show origin
检查 origin
是否指向正确的 URL(参见此帖子)。我需要做完全相同的事情。这是我的Ruby脚本。
#!/usr/bin/env ruby
local = []
remote = {}
# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
line.strip!
if /origin\//.match(line)
remote[line.gsub(/origin\//, '')] = line
else
local << line
end
end
# Update
remote.each_pair do |loc, rem|
next if local.include?(loc)
%x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]
这里是另一个简短的单行命令,可以为所有远程分支创建本地分支:
(git branch -r | sed -n '/->/!s#^ origin/##p' && echo master) | xargs -L1 git checkout
如果已经创建了本地分支,它也可以正确运行。您可以在第一次 git clone
之后或任何时候调用它。
如果克隆后不需要检出 master
分支,请使用
git branch -r | sed -n '/->/!s#^ origin/##p'| xargs -L1 git checkout
git fetch <origin-name> <branch-name>
可以为您带来分支。虽然这不会一次拉取所有分支,但您可以逐个执行每个分支。mkdir somerepo
cd somerepo
git clone --bare git@github.com:someuser/somerepo.git .git
git config --bool core.bare false
git reset --hard
git branch
完成了!您已经全部获得了分支!
git rev-parse --abbrev-ref --symbolic-full-name '@{u}'
显示 fatal: no upstream configured for branch 'master'
。应该是 origin/master
。 - konsoleboxorigin
上的每个分支创建一个本地分支,以匹配指定的pattern
。#!/bin/sh
git fetch --all
git for-each-ref --format='%(refname:short)' refs/remotes/origin/pattern |\
sed 's@\(origin/\)\(.*\)@\2\t\1\2@' |\
xargs -n 2 git branch --track
所有远程引用(分支/标签)都被获取,然后创建本地引用。在大多数系统上运行良好,速度快,无需检出索引或依赖于bashisms。
我无法编辑Bigfish的答案。他提出了一个bash脚本,我建议更新并提供更好的git集成。egrep已经过时,应该被grep -E替换。
#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | grep -E --invert-match '(:?HEAD|master)$'); do
git branch --track "${branch##*/}" "$branch"
done
您可以通过将此bash文件添加为git自定义子命令来扩展git:
$ mkdir ~/.gitbin; touch ~/.gitbin/git-fetchThemAll
$ chmod u+x ~/.gitbin/git-fetchThemAll
git-fetchThemAll
中。$ echo 'export PATH="$HOME/.gitbin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc # update PATH in your current shell
$ git fetchThemAll
mkdir YourRepo
cd YourRepo
git init --bare .git # create a bare repo
git remote add origin REMOTE_URL # add a remote
git fetch origin refs/heads/*:refs/heads/* # fetch heads
git fetch origin refs/tags/*:refs/tags/* # fetch tags
git init # reinit work tree
git checkout master # checkout a branch
目前为止,这对我来说是有效的。
git fetch
的refspec章节下的注释#2(http://www.kernel.org/pub/software/scm/git/docs/git-fetch.html),这可能需要进行调整。 - Andygit checkout -b recreated-branch-name
git branch -a (to list remote branches)
git rebase remotes/remote-origin/recreated-branch-name
如果我从 gituser/master fork 到 sjp,然后分支到 sjp/mynewbranch,它会看起来像这样:
$ git checkout -b mynewbranch
$ git branch -a
master
remotes/sjp/master
remotes/sjp/mynewbranch
$ git fetch (habit to always do before)
$ git rebase remotes/sjp/mynewbranch
git merge path/to/source.git --mirror
cd source.git
git remote remove origin
git remote add origin path/to/target.git
git push origin --all
git push origin --tags
git branch -a
)会展示远程仓库中的分支,但是如果你试图检出它们中的任何一个,你将处于'脱离HEAD'状态。第二个最受赞同的回答回答了另一个问题(即如何拉取所有分支,并且再次强调,这仅适用于你在本地跟踪的分支)。其中一些评论指出,你可以使用shell脚本解析git branch -a
的结果来本地跟踪所有远程分支。总结:没有Git原生方法可以实现你想要的功能,而且也许这并不是一个好主意。 - Day Davis Waterburyscp some_user@example.com:/home/some_user/project_folder ~
不确定这种解决方案是否适用于GitHub... - snapfractalpop