我有一个master
和一个development
分支,都推送到GitHub上。我已经clone
d,pull
ed和fetch
ed,但是除了master
分支返回之外,我仍然无法获得其他任何东西。
我敢肯定我遗漏了一些明显的东西,但是我已经阅读了手册,一点都没有高兴。
scp some_user@example.com:/home/some_user/project_folder ~
不知道该解决方案是否适用于github ..
我有一个master
和一个development
分支,都推送到GitHub上。我已经clone
d,pull
ed和fetch
ed,但是除了master
分支返回之外,我仍然无法获得其他任何东西。
我敢肯定我遗漏了一些明显的东西,但是我已经阅读了手册,一点都没有高兴。
scp some_user@example.com:/home/some_user/project_folder ~
不知道该解决方案是否适用于github ..
Answers:
$ git clone git://example.com/myproject
$ cd myproject
接下来,查看存储库中的本地分支:
$ git branch
* master
但是您的存储库中还隐藏着其他分支!您可以使用-a
标志:
$ git branch -a
* master
remotes/origin/HEAD
remotes/origin/master
remotes/origin/v1.0-stable
remotes/origin/experimental
如果您只想快速浏览上游分支机构,可以直接查看:
$ git checkout origin/experimental
但是,如果要在该分支上工作,则需要创建一个本地跟踪分支,该分支可以通过以下方式自动完成:
$ git checkout experimental
你会看到
Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'
最后一行引发了一些人:“新分支”-是吗?这实际上意味着分支是从索引中提取的,并为您本地创建。在前面的行实际上是更多的信息,因为它告诉你的分支正在建立跟踪远程分支,这通常意味着起源/ branch_name分支
现在,如果您查看本地分支机构,将会看到以下内容:
$ git branch
* experimental
master
实际上,您可以使用跟踪多个远程存储库git remote
。
$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
remotes/origin/HEAD
remotes/origin/master
remotes/origin/v1.0-stable
remotes/origin/experimental
remotes/win32/master
remotes/win32/new-widgets
在这一点上,事情变得非常疯狂,因此请运行gitk
以查看发生了什么:
$ gitk --all &
如果您要一次获取许多远程分支,请执行以下操作:
$ git pull --all
现在,您可以根据需要签出任何分支,而无需访问远程存储库。
git pull --all
做同样的事情-它不会两次获取。而infosec812是正确的,因为它无论如何都不能回答问题。我不知道这怎么得到这么多的支持。
git remote update
,然后尝试git branch
,我只看到本地分支。但是,如果可以,git branch -a
我现在可以看到远程分支,并且可以通过a git pull <branchname>
获得所需的分支。-我从Google搜索中找到了这个问题,这个答案解决了我的问题。
这个Bash脚本帮助我:
#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
git branch --track "${branch##*/}" "$branch"
done
它将为所有远程分支(主服务器除外)创建跟踪分支(您可能是从原始克隆命令获得的)。我认为您可能仍需要做一个
git fetch --all
git pull --all
为了确定。
一个衬里:
git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs
像往常一样:复制我们的rm -rf Universe之前,请在您的设置中进行测试一线积分归功于用户CFI
git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs
与往常一样:在复制之前在您的设置中进行测试rm -rf universe as we know it
remotes/origin/
为了保留名称空间for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done
使用该--mirror
选项似乎可以remote
正确复制跟踪分支。但是,它会将存储库设置为裸存储库,因此之后必须将其转换回普通存储库。
git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch
git checkout
作为最后一条命令,以最终检出克隆的仓库上当前分支的头部。这是一个很好的答案,到目前为止是最好的。勇敢一点,最终我们会带您到达顶端:-)
git remote update
将再次这样做。拉动行为改变。我回到相信完整的副本需要一个单行脚本。
git clone --mirror
非常适合备份您的git存储库^ _ ^
您可以轻松切换到分支,而无需使用奇特的“ git checkout -b somebranch origin / somebranch”语法。您可以这样做:
git checkout somebranch
Git会自动做正确的事情:
$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'
Git将检查在一个远程站点中是否存在同名分支,如果存在,它将以与您明确指定它是远程分支相同的方式进行跟踪。从Git 1.8.2.1的git-checkout手册页中:
如果未找到<branch>,但确实在一个具有匹配名称的远程站点(称为<remote>)中存在跟踪分支,则将其等同于
$ git checkout -b <branch> --track <remote>/<branch>
checkout
名称与远程分支的名称相同,则在“ /”之后的所有内容,然后git将创建一个同名的分支,在“ /”之后的所有内容,“跟踪”该远程?并通过跟踪,我们的意思是:git push
,git pull
,等将是遥控器上做什么?如果正确,请在答案上提供更多信息,因为我同意@Daniel的观点,因此该答案值得您多指。
git checkout --track origin/somebranch
明确地说出来。
您正在执行的访存应获取所有远程分支,但不会为它们创建本地分支。如果使用gitk,则应该看到远程分支描述为“ remotes / origin / dev”或类似内容。
要基于远程分支创建本地分支,请执行以下操作:
git checkout -b dev refs / remotes / origin / dev
应该返回如下内容:
设置分支开发以跟踪远程分支引用/远程/原始/开发。 切换到新的分支“ dev”
现在,当您在dev分支上时,“ git pull”将把您的本地dev更新到与远程dev分支相同的位置。请注意,它将获取所有分支,但仅将您所在的分支拉到树的顶部。
git checkout -b newlocaldev --track origin/dev
。如果您希望本地分支与远程分支具有相同的名称,并且远程分支没有棘手的名称,则可以省略-b newlocaldev
。使用默认的branch.autosetupmerge
config设置,并假设您没有名为的本地分支dev
,这两个命令可能会执行相同的操作:git checkout -b dev origin/dev
和plain git checkout dev
。最后,git checkout origin/dev
不创建新分支,而只是将您置于分离的HEAD状态。
git branch -a
继续将其列为远程分支。
当您执行“ git clone git:// location”时,将提取所有分支和标记。
为了在特定的远程分支之上工作,假设它是源远程:
git checkout -b branch origin/branchname
$ git branch -a
学习哪些远程分支已经可用。
git checkout -b master origin/master
和git checkout --track origin/master
请问有什么区别吗?
使用别名。虽然没有任何本地Git一线客机,但您可以将自己定义为
git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
然后将其用作
git clone-branches
git clone
下载所有远程分支,但即使文件位于您的新存储库中,也仍然将它们视为“远程”。唯一的例外是,克隆过程会从称为“ master”的远程分支创建一个名为“ master”的本地分支。默认情况下,git branch
仅显示本地分支,这就是为什么您只看到“ master”的原因。
git branch -a
显示所有分支,包括远程分支。
如果您确实想在分支上工作,则可能需要它的“本地”版本。要简单地从远程分支创建本地分支(无需检出它们,从而不更改工作目录的内容),可以这样进行:
git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree
在此示例中,branchone
是您基于所创建的本地分支的名称origin/branchone
。如果您想使用不同的名称创建本地分支,则可以执行以下操作:
git branch localbranchname origin/branchone
创建本地分支后,您可以通过看到它git branch
(请记住,您无需-a
查看本地分支)。
origin/branchone
存在,您也可以只使用git checkout branchone
相同的名称创建一个本地分支并将其设置为远程跟踪。
这并不太复杂,非常简单直接的步骤如下:
git fetch origin
这会将所有远程分支带到您的本地。
git branch -a
这将向您显示所有远程分支。
git checkout --track origin/<branch you want to checkout>
通过以下命令验证您是否在所需的分支中;
git branch
输出将像这样;
*your current branch
some branch2
some branch3
请注意,*符号表示当前分支。
迟到总比不到好,但这是执行此操作的最佳方法:
mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard
至此,您已拥有远程回购及其所有分支的完整副本(通过验证git branch
)。如果您的远程仓库有自己的远程服务器--mirror
,--bare
则可以使用代替。
--bare
最后一句中提到的“ ”在给定的命令列表中不存在。
error: key does not contain a section: unset
。在Dave的答案更好地工作。
git config --unset core.bare
其实......对我来说,这似乎是所有在这里的答案提出的干净的解决方案。可惜它的投票很少...
只是这样做:
$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
master
$ git branch -a
* branchxyz
master
remotes/origin/HEAD -> origin/master
remotes/origin/branchxyz
remotes/origin/branch123
您会看到,'git clone git://example.com/myprojectt'会获取所有内容,甚至是分支,您只需要检出它们,即可创建本地分支。
您只需要使用“ git clone”即可获取所有分支。
git clone <your_http_url>
即使只看到master分支,也可以使用“ git branch -a”查看所有分支。
git branch -a
您可以切换到任何已有的分支。
git checkout <your_branch_name>
不用担心,在您进行“ git clone”操作后,无需连接远程回购协议,当您关闭wifi时,“ git branch -a”和“ git checkout”可以成功运行。因此证明,当您执行“ git clone”时,它已经从远程仓库中复制了所有分支。在那之后,您不需要远程仓库,您的本地已经有了所有分支机构的代码。
A git clone
应该复制整个存储库。尝试克隆它,然后运行git branch -a
。它应该列出所有分支。如果这样您想切换到分支“ foo”而不是“ master”,请使用git checkout foo
。
git clone
确实下载了所有远程分支,但它仅使master成为本地分支。由于git branch
仅显示本地分支,因此您也需要git branch -a
查看远程分支。
使用我的工具git_remote_branch(您需要在机器上安装Ruby)。它是专门为使远程分支操作变得简单而构建的。
每次它代表您执行操作时,它将在控制台上以红色打印。随着时间的流逝,它们最终进入您的大脑:-)
如果您不想让grb代表您运行命令,则只需使用“说明”功能。这些命令将被打印到您的控制台上,而不是为您执行。
最后,所有命令都具有别名,以便于记忆。
请注意,这是Alpha软件;-)
这是运行grb help时的帮助:
git_remote_branch版本0.2.6 用法: grb create branch_name [origin_server] grb发布branch_name [origin_server] grb重命名branch_name [origin_server] grb delete分支名称[origin_server] grb track branch_name [origin_server] 笔记: -如果未指定origin_server,则假定名称为“ origin” (git的默认值) -重命名功能可重命名当前分支 说明元命令:您还可以在任何命令前添加 关键字“说明”。git_remote_branch代替执行命令 只会输出您需要运行以完成的命令列表 这个目标。 例: 解释 grb解释创建my_branch github 所有命令还具有别名: 创建:创建,新 删除:删除,销毁,杀死,删除,rm 发布:发布,远程处理 重命名:重命名,rn,mv,移动 跟踪:跟踪,跟踪,抓取,提取
我在这里看到的所有答案都是有效的,但是有一种更干净的方法来克隆存储库并一次拉出所有分支。
克隆存储库时,实际上会下载所有分支的信息,但是分支是隐藏的。用命令
$ git branch -a
您可以显示存储库的所有分支,并使用以下命令
$ git checkout -b branchname origin/branchname
您可以一次手动“下载”它们。
但是,当您要克隆带有许多分支的仓库时,相对于我将要展示的一种更干净,更快捷的方法,上述所有方法都是冗长而乏味的,尽管有点复杂。您需要完成以下三个步骤:
在您的机器上创建一个新的空文件夹,并从存储库中克隆.git文件夹的镜像副本:
$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
$ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
文件夹my_repo_folder内的本地存储库仍然为空,现在只有一个隐藏的.git文件夹,您可以从终端使用“ ls -alt”命令查看该文件夹。
通过将git配置的布尔值“ bare”切换为false,将此存储库从空(裸)存储库切换为常规存储库:
$ git config --bool core.bare false
抓取当前文件夹内的所有内容,并在本地计算机上创建所有分支,因此将其作为常规存储库。
$ git reset --hard
因此,现在您只需键入命令“ git branch”,即可看到所有分支均已下载。
这是一种可以一次克隆所有分支的git存储库的快速方法,但是您不想以此方式对每个项目进行操作。
从本地存储库克隆不适用于git clone和git fetch:许多分支/标签将保持未提取状态。
获得具有所有分支和标签的克隆。
git clone --mirror git://example.com/myproject myproject-local-bare-repo.git
要获得具有所有分支和标签以及工作副本的克隆,请执行以下操作:
git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master
好的,克隆仓库时,所有分支都在那里...
如果您只是这样做git branch
,它们就是隐藏的...
因此,如果您想查看所有分支名称,只需添加如下--all
标记:
git branch --all
要么 git branch -a
如果您仅结帐至分支机构,则将获得所需的一切。
但是克隆后如果其他人创建的分支又如何呢?
在这种情况下,请执行以下操作:
git fetch
然后再次检查所有分支...
如果您想同时提取和结帐,可以执行以下操作:
git fetch && git checkout your_branch_name
还为您创建了以下图像,以简化我所说的内容:
在查看问题的答案之一时,我注意到可以将其缩短:
for branch in `git branch -r | grep -v 'HEAD\|master'`; do
git branch --track ${branch##*/} $branch;
done
但是要注意,如果远程分支之一被命名为admin_master,它将不会被下载!
感谢bigfish的初衷
grep
来改进过滤器,以防止误报。
#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
git branch --track ${branch#remotes/origin/} $branch
done
这些代码会将所有远程分支代码拉到本地存储库。
对于复制粘贴到命令行:
git checkout master ; remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master
为了提高可读性:
git checkout master ;
remote=origin ;
for brname in `
git branch -r | grep $remote | grep -v master | grep -v HEAD
| awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
git branch -D $brname ;
git checkout -b $brname $remote/$brname ;
done ;
git checkout master
我编写了这个小的Powershell函数,以便能够检出我的所有git分支,这些分支位于源远程。
Function git-GetAllRemoteBranches {
iex "git branch -r" <# get all remote branches #> `
| % { $_ -Match "origin\/(?'name'\S+)" } <# select only names of the branches #> `
| % { Out-Null; $matches['name'] } <# write does names #>
}
Function git-CheckoutAllBranches {
git-GetAllRemoteBranches `
| % { iex "git checkout $_" } <# execute ' git checkout <branch>' #>
}
在我的git设置库中可以找到更多的git功能
这是使用awk的答案。如果在新的仓库上使用该方法就足够了。
git branch -r | awk -F/ '{ system("git checkout " $NF) }'
现有分支将仅被检出或声明为已经存在,但是可以添加过滤器以避免冲突。
也可以对其进行修改,以便调用显式git checkout -b <branch> -t <remote>/<branch>
命令。
另外,我们可以指定远程分支。这是基于murphytalk的答案。
git branch -r | awk '{ system("git checkout -t " $NF) }'
它在冲突时引发致命的错误消息,但我认为它们无害。
这两个命令都可以使用别名。
git config --global alias.clone-branches '! git branch -r | awk -F/ "{ system(\"git checkout \" \$NF) }"'
git config --global alias.clone-branches '! git branch -r | awk "{ system(\"git checkout -t \" \$NF) }"'
我个人会使用track-all
或track-all-branches
。
我需要做的完全一样。这是我的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]
这些答案都没有解决这个问题,只是没有人在正确的轨道上。
我在将存储库从一个服务器/系统移动到另一个服务器/系统时遇到了麻烦。当我克隆存储库时,它仅为master创建一个本地分支,因此当我推送到新的远程服务器时,只推送了master分支。
因此,我发现这两种方法非常有用。希望他们能帮助别人。
方法1:
git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo
方法2:
git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo
Git通常(未指定时git ls-refs
)从一个或多个其他存储库中获取所有分支和/或标签(参考,请参阅:)以及完成其历史记录所需的对象。换句话说,它获取已下载对象可访问的对象。请参阅:实际上git fetch
是做什么的?
有时您的分支/标记可能没有直接连接到当前分支/标记,因此在这种情况下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
如果您仍然无法获得master分支以外的任何其他内容,请检查以下内容:
git remote -v
),例如
git config branch.master.remote
是origin
。origin
指向正确的URL git remote show origin
(请参阅此帖子)。截至2017年初,此评论中的答案有效:
git fetch <origin-name> <branch-name>
为您带来分支。尽管这不会一次拉出所有分支,但您可以按分支单独执行此操作。
git branch -a
)向您显示了远程中的分支,但是如果您尝试将其中的任何一个都签出,则您将处于“分离头”状态。下一个答案向下(第二高的投票数)回答了一个不同的问题(即:如何拉出所有分支,同样,这仅适用于您在本地跟踪的分支)。一些评论指出,您可以git branch -a
使用将本地跟踪所有远程分支的Shell脚本解析结果。简介:没有git本机方法可以执行您想要的操作,而且它可能不是一个好主意。