git从远程存储库中提取所有分支

Mar*_*lny 25 git version-control remote-branch git-branch

如何将所有远程分支拉到我自己的存储库?

如果我输入:

git branch -a
Run Code Online (Sandbox Code Playgroud)

我得到了很长的分支列表,但如果我输入:

git branch 
Run Code Online (Sandbox Code Playgroud)

我只看到其中的两个.

如何将所有分支拉入本地列表?

我知道我能做到:

git checkout --track origin/branch-name
Run Code Online (Sandbox Code Playgroud)

但是,它一次只能拉出并检出一个分支.有没有什么方法可以一次性完成所有这一切,而不需要git checkout --track origin/branch-name一遍又一遍地运行这些繁琐乏味的工作?


PS.我尝试了以下命令,没有一个命令使远程分支出现在我的git branch列表中:

git fetch --all
git remote update
git pull --all
Run Code Online (Sandbox Code Playgroud)

Uwe*_*der 18

请阅读此解释http://git-scm.com/book/en/Git-Branching-Remote-Branches

首先让我们澄清一些git术语:

  • 获取:从远程仓库获取内容(或更新)
  • pull:fetch(如上所述)并在一步中合并

原始海报没有提到合并,所以我可能会用适当的git术语猜测他甚至可能想要"git从远程存储库获取所有分支"

如果你看到分支,git branch -a那么你已经获取了它们.您可以通过提供命令来验证这一点git show remotes/origin/some-branch:some-file

或者可以做例如 git diff remotes/origin/some-branch master

你甚至可以看看它们 git checkout remotes/origin/some-branch

(为了确保您可以移除网络电缆,您将看到命令在不联系远程仓库的情况下工作.)

名为remotes/...的分支称为远程分支,但它们已被提取到您的仓库.它们是只读的,您无法修改它们(这就是签出时出现消息的原因).虽然它们在最后一次获取或拉取操作时反映了远程仓库的状态,但实际上它们存储在本地.

如果你这样做git checkout some-branch并且某些分支尚不存在但是存在remotes/origin/some-branch,git将为你创建一个名为some-branch的跟踪分支(1).同样这是一个本地操作,所有数据都已经被提取(或者如果你最近没有获取,你将开始处理一个过时的版本).最初跟踪分支的内容与其远程分支相同.但是,您可以在本地修改跟踪分支.

git工作区包含一个分支的状态.因此,关于一次检出所有远程分支的问题在git的上下文中确实没有意义.你可以一个接一个地看看它们.但每次检查下一个,前一个将从工作区域消失.当然,这个操作可以编写脚本,如跟踪所有远程git分支作为本地分支但是如果只有最后一步仍然是什么,那么编写一个批量操作的脚本是什么意思?

假设远程分支只能远程存储,而不是本地存储而你只是想确保你拥有本地的所有内容,那么问题可能是由于误解造成的.如果您确实希望一次签出多个分支,则可以在本地克隆您的仓库并将不同的分支机构签入不同的工作区域.(2)

简而言之:如果您想确保您拥有远程仓库中本地可用的所有数据,请使用git fetch [repo].除非您已经调整了配置,否则将获取所有分支,即更新现有远程分支,并在适用时创建新的远程分支.

(1)在简单的标准情况下也是如此.在具有多个远程或手动配置的远程控制器的更复杂情况下,您可能需要--track选项来准确指定所需的内容.

(2)git worktree此用例有一个新功能.然而,截至2018年初,它仍然具有实验性


Von*_*onC 16

我通常用来创建所有可见上游分支并跟踪它们的命令详见"将所有远程git分支跟踪为本地分支 ":

remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch --set-upstream-to $remote/$brname $brname ; done
Run Code Online (Sandbox Code Playgroud)

要么:

remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch --track $brname $remote/$brname  ; done
Run Code Online (Sandbox Code Playgroud)

为了更好的可读性:

remote=origin ; // put here the name of the remote you want
for brname in `
  git branch -r | grep $remote | grep -v master | grep -v HEAD 
  | awk '{gsub(/[^\/]+\//,"",$1); print $1}'
`; do 
  git branch --set-upstream-to $remote/$brname $brname; 
  # or
  git branch --track $brname  $remote/$brname ; 
done
Run Code Online (Sandbox Code Playgroud)

第二个是创建跟踪远程分支的新本地分支.


pix*_* 67 9

我一直在用这个,而且效果很好

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
Run Code Online (Sandbox Code Playgroud)


Mr.*_*dir 6

你应该尝试这样的事情:

git fetch --all
for branch in `git branch -r | cut -d '/' -f2-` ; do git checkout $branch && git pull origin $branch ; done
Run Code Online (Sandbox Code Playgroud)