如何在Git中克隆所有远程分支?

时间:2008-09-15 22:42:07

标签: git github git-branch git-clone remote-branch

我有一个master和一个development分支,都被推送到GitHub。我已经clone d,pullfetch编辑,但我仍然无法获得除master分支以外的任何内容。

我确信我错过了一些明显的东西,但我已经阅读了手册,而且我一点也不开心。

44 个答案:

答案 0 :(得分:4280)

首先,将远程Git存储库和cd克隆到其中:

$ 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'

最后一行引发了一些人:“新分支” - 是吧? 它的真正含义是从索引中获取分支并在本地为您创建。 之前的行实际上提供了更多信息,因为它告诉您正在设置分支以跟踪远程分支,这通常意味着origin / 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 &

答案 1 :(得分:774)

如果您想要一次获取许多远程分支,请执行以下操作:

$ git pull --all

现在您可以根据需要签出任何分支,而无需访问远程存储库。

答案 2 :(得分:392)

这个Bash脚本帮助了我:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

它将为除master之外的所有远程分支创建跟踪分支(您可能从原始克隆命令获得)。我想你可能还需要做一个

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

答案 3 :(得分:315)

使用--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 FAQ: How do I clone a repository with all remotely tracked branches?

答案 4 :(得分:209)

您可以轻松切换到分支,而无需使用花哨的“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>

答案 5 :(得分:90)

关于,

  

$ git checkout -b experimental origin / experimental

使用

$ git checkout -t origin/experimental

或者更详细但更容易记住

$ git checkout --track origin/experimental
在跟踪远程存储库方面,

可能会更好。

答案 6 :(得分:78)

您正在执行的提取应该获取所有远程分支,但不会为它们创建本地分支。如果你使用gitk,你应该看到远程分支被描述为“remotes / origin / dev”或类似的东西。

要基于远程分支创建本地分支,请执行以下操作:

git checkout -b dev refs/remotes/origin/dev

应该返回类似的内容:

Branch dev set up to track remote branch refs/remotes/origin/dev.
Switched to a new branch "dev"

现在,当你在dev分支上时,“git pull”会将你的本地dev更新到与远程dev分支相同的点。请注意,它将获取所有分支,但只将您所在的分支拉到树的顶部。

答案 7 :(得分:57)

当您执行“git clone git:// location”时,将获取所有分支和标记。

为了在特定的远程分支上工作,假设它是原始远程分支:

git checkout -b branch origin/branchname

答案 8 :(得分:50)

使用别名。虽然没有任何本机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

答案 9 :(得分:45)

为什么你只看到“主人”

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查看本地分支)。

答案 10 :(得分:44)

这不是太复杂,非常简单,直截了当的步骤如下;

git fetch origin这会将所有远程分支带到您的本地。

git branch -a这将显示所有远程分支。

git checkout --track origin/<branch you want to checkout>

通过以下命令验证您是否在所需的分支中;

git branch

输出会是这样的;

*your current branch 
some branch2
some branch3 

注意表示当前分支的*符号。

答案 11 :(得分:44)

迟到总比没有好,但这是最好的方法:

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

此时,您拥有远程仓库的完整副本及其所有分支(使用git branch验证)。如果你的远程仓库有自己的遥控器,你可以使用--mirror而不是--bare

答案 12 :(得分:38)

这样做:

$ 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'取出所有东西,甚至是分支,你只需要签出它们,然后就会创建你的本地分支。

答案 13 :(得分:23)

你只需要使用&#34; git clone&#34;得到所有分支。

git clone <your_http_url>

即使您只看到master分支,也可以使用&#34; git branch -a&#34;看到所有分支。

git branch -a

你可以切换到你已经拥有的任何分支。

git checkout <your_branch_name>

不要担心,在你&#34; git clone&#34;之后,你不需要连接远程仓库,&#34; git branch -a&#34;和&#34; git checkout&#34;关闭wifi时可以成功运行。所以事实证明,当你执行git clone&#34;时,它已经从远程仓库复制了所有分支。在那之后,你不需要远程回购,你的本地已经拥有所有分支机构&#39;码。

答案 14 :(得分:20)

git clone应该复制整个存储库。尝试克隆它,然后运行git branch -a。它应列出所有分支。如果那时你想切换到分支“foo”而不是“master”,请使用git checkout foo

答案 15 :(得分:19)

使用我的工具git_remote_branch(您需要在计算机上安装Ruby)。它专门用于使远程分支操作变得容易。

每次代表您进行操作时,它会在控制台上以红色打印。随着时间的推移,他们终于坚持到你的大脑: - )

如果您不希望grb代表您运行命令,只需使用'explain'功能即可。这些命令将打印到您的控制台,而不是为您执行。

最后,所有命令都有别名,以便记忆更容易。

请注意,这是alpha software; - )

这是运行grb help时的帮助:

git_remote_branch version 0.2.6

  Usage:

  grb create branch_name [origin_server] 

  grb publish branch_name [origin_server] 

  grb rename branch_name [origin_server] 

  grb delete branch_name [origin_server] 

  grb track branch_name [origin_server] 



  Notes:
  - If origin_server is not specified, the name 'origin' is assumed 
    (git's default)
  - The rename functionality renames the current branch

  The explain meta-command: you can also prepend any command with the 
keyword 'explain'. Instead of executing the command, git_remote_branch 
will simply output the list of commands you need to run to accomplish 
that goal.

  Example: 
    grb explain create
    grb explain create my_branch github

  All commands also have aliases:
  create: create, new
  delete: delete, destroy, kill, remove, rm
  publish: publish, remotize
  rename: rename, rn, mv, move
  track: track, follow, grab, fetch

答案 16 :(得分:16)

我在这里看到的所有答案都是有效的,但有一种更清晰的方法来克隆存储库并立即拉出所有分支。

克隆存储库时,实际下载了分支的所有信息,但隐藏了分支。使用命令

$ git branch -a

您可以使用命令

显示存储库的所有分支
$ git checkout -b branchname origin/branchname

然后您可以一次手动“下载”它们。

然而,当你想要克隆一个包含很多分支的回购时,所有上面说明的方式都是冗长乏味的,这是我要展示的更清洁,更快捷的方式,尽管它有点复杂。您需要三个步骤来完成此任务:

  1. 第一步
  2. 在您的计算机上创建一个新的空文件夹,并从存储库中克隆.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”命令。

    1. 第二步
    2. 通过将git配置的布尔值“裸”切换为false,将此存储库从空(裸)存储库切换到常规存储库:

      $ git config --bool core.bare false
      
      1. 第三步
      2. 抓取当前文件夹中的所有内容并在本地计算机上创建所有分支,从而使其成为正常的回购。

        $ git reset --hard
        

        所以现在你可以输入命令“git branch”,你可以看到所有的分支都被下载了。

        这是您可以快速克隆包含所有分支的git存储库的方法,但这并不是您希望以这种方式为每个项目执行的操作。

答案 17 :(得分:12)

好的,当你克隆你的回购时,那里有你所有的分支......

如果你只是做git branch,它们就会被隐藏......

因此,如果您希望查看所有分支名称,只需添加--all这样的标记:

git branch --allgit branch -a

如果你只是结帐到分行,你得到了所需的一切。

但是如果你克隆后由其他人创建分支怎么样?

在这种情况下,只需:

git fetch

再次检查所有分支......

如果您想同时获取和结帐,可以执行以下操作:

git fetch && git checkout your_branch_name

还创建了下面的图片,以简化我所说的内容:

git branch --all to get all branches

答案 18 :(得分:12)

看一下这个问题的答案,我注意到它可以缩短它:

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

但要注意,如果其中一个远程分支被命名为例如admin_master它不会被下载!

感谢bigfish的原创理念

答案 19 :(得分:11)

#!/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

这些代码会将所有远程分支代码拉到本地仓库。

答案 20 :(得分:10)

复制粘贴到命令行:

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

<小时/> 这将:

  1. 检查主人(以便我们可以删除我们所在的分支)
  2. 选择远程结帐(将其更改为您拥有的任何遥控器)
  3. 循环遍历除master和HEAD之外的所有分支
    1. 删除本地分支(以便我们可以查看强制更新的分支机构)
    2. 从远程
    3. 查看分支
  4. 检查主人(为此)
  5. 基于answerVonC

答案 21 :(得分:8)

我写了这个小的 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>' #>
}

可以在my git settings repo

上找到更多git函数

答案 22 :(得分:8)

我需要完全一样。这是我的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]

答案 23 :(得分:7)

通常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.remoteorigin
    • 检查origin是否通过以下网址指向了正确的网址:git remote show origin(请参阅此post)。

答案 24 :(得分:6)

这些答案都没有削减,除非用户没人在正确的轨道上。

我将回购从一个服务器/系统移动到另一个服务器/系统时遇到了问题。当我克隆了repo时,它只为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

答案 25 :(得分:6)

使用您能记住的命令

我使用的是Atlassian的Repository Hosting Service Bitbucket。所以我试着关注他们的文档。这对我来说非常有效。使用以下简单和简短命令,您可以检出远程分支。

首先克隆您的存储库,然后切换到目标文件夹。最后但并非最不重要的是获取和结帐:

git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>

那就是它。这里有一个更真实的例子:

git clone https://username@bitbucket.org/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop

您可以在文档中找到有关命令的详细信息: Clone CommandFetch CommandCheckout Command

答案 26 :(得分:6)

截至2017年初,答案https://msdn.microsoft.com/en-us/library/6c3yckfw(v=vs.85).aspx有效:

git fetch <origin-name> <branch-name>为您带来了分支。虽然这不会立即拉出所有分支,但您可以单独执行此分支。

答案 27 :(得分:5)

这是另一个简短的单线命令 为所有远程分支创建本地分支:

(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

答案 28 :(得分:5)

原始回购中的

(a is None) ^ (b is None) 适用于此。

git clone --mirror

答案 29 :(得分:2)

我要在这里加2美分,因为我在这里试图找出如何拉下我在本地删除的远程分支。 Origin不是我的,我不想经历重新克隆一切的麻烦

这对我有用:

假设您需要在本地重新创建分支:

git checkout -b recreated-branch-name
git branch -a (to list remote branches)
git rebase remotes/remote-origin/recreated-branch-name

所以,如果我从gituser / master分到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

答案 30 :(得分:2)

此解决方案对我有用,可以将存储库“复制”到另一个存储库:

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

在目标存储库上,我可以看到与原始存储库相同的分支和标签。

答案 31 :(得分:2)

更新:

已接受的git branch -a答案仅显示远程分支。除非您可以通过网络访问原始服务器,否则将无法访问分支机构。

尝试checkout分支将失败或使您处于“分离的HEAD”状态。


TL; DR

如果您要查找“ 自包含的克隆/备份 包含所有远程分支和提交日志的”,请使用:


git clone http://user@repo.url ; git pull --all


信用:Gabe Kopley's用于建议git pull --all部分。


NB:
如果您再无权访问 remote/origin branches 服务器, remote/origin 中将不会反映任何更新。它们的修订仅从您执行初始git clone http://user@repo.url ; git pull --all命令的日期和时间开始反映。


此外,git pull --all不会为您结帐或创建本地分支。为此,请使用下面的命令之一或手动运行git checkout remote/origin/<branchname>(即使您不再具有对 remote/origin 服务器的网络访问权限)。使用git branch -a来显示保存在clone存储库中的远程分支。

---更新结束


原始答案:

这应该可以解决问题:

$ for i in $(git branch -a |grep 'remotes' | awk -F/ '{print $3}' \ 
| grep -v 'HEAD ->');do git checkout -b $i --track origin/$i; done

OR

如果您的仓库中有嵌套的分支,那么此命令将考虑到这一点:

for i in $(git branch -a |grep 'remotes' |grep -v 'HEAD ->');do \
basename ${i##\./} | xargs -I {} git checkout -b {} --track origin/{}; done


上面的命令会将checkout的本地分支添加到本地存储库中,其名称与 remote/origin/<branchname> 相同,并将其设置为--track。对您的 local 存储库执行remote/origin命令的 git pull 服务器。

答案 32 :(得分:2)

这是使用awk的答案。如果在新的仓库中使用该方法,就足够了。

git branch -r | awk -F/ '{ system("git checkout " $NF) }'

现有分支将仅被检出或声明为已经存在,但是可以添加过滤器以避免冲突。

还可以对其进行修改,以使其调用显式的git checkout -b <branch> -t <remote>/<branch>命令。

此答案紧跟Nikos C.idea


或者,我们可以改为指定远程分支。这是基于murphytalkanswer

git branch -r | awk '{ system("git checkout -t " $NF) }'

它在冲突时引发致命错误消息,但我认为它们无害。


两个命令都可以别名。

使用nobodyanswer作为参考,我们可以使用以下命令来创建别名:

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-alltrack-all-branches

答案 33 :(得分:2)

此变体将克隆一个远程回购,其中所有分支都可以在本地使用,而不必逐个签出每个分支。不需要花哨的脚本。

使用与您要克隆的存储库相同的名称制作一个文件夹,然后将其插入cd:

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

Voiala!你在那里有所有分支!

答案 34 :(得分:1)

在这里,我写了一个很好的函数使它易于重复

gitCloneAllBranches() { # clone all git branches at once easily and cd in
  # clone as "bare repo"
  git clone --mirror $1
  # rename without .git extension
  with_extension=$(basename $1)
  without_extension=$(echo $with_extension | sed 's/.git//')
  mv $with_extension $without_extension
  cd $without_extension
  # change from "bare repository" to not
  git config --bool core.bare false
  # check if still bare repository if so
  if [[ $(git rev-parse --is-bare-repository) == false ]]; then
    echo "ready to go"
  else
    echo "WARNING: STILL BARE GIT REPOSITORY"
  fi
  # EXAMPLES:
  # gitCloneAllBranches https://github.com/something/something.git
}

答案 35 :(得分:0)

每当需要关闭所有分支机构时,便会执行此操作。来自Linkedin Learning的 Ray Villalobos 。尝试克隆所有分支,包括提交;
  • $ mkdir -p -- newproject_folder
  • $ cd newproject_folder
  • $ git clone --mirror https://github.com/USER_NAME/RepositoryName.git .git
  • $ git config --bool core.bare false
  • $ git reset --hard

答案 36 :(得分:0)

我在 1 个月前成功的总结:

mkdir -p -- myapp-mirror
cd myapp-mirror
git clone --mirror https://git.myco.com/mygroup/myapp.git .git
git config --bool core.bare false
git config --bool core.logAllRefUpdates true
git reset --hard

基于几个答案。

答案 37 :(得分:0)

对远程仓库进行裸克隆,将内容保存到 .git 目录

git clone --bare remote-repo-url.git localdirname/.git

(使用 git clone --bare 或 git init --bare 创建的裸 git 存储库是存储存储库,它没有工作目录,您不能在那里创建或修改文件。)

将目录更改为本地目录

cd localdirname

使您的 git 存储库可修改

git config --bool core.bare false

恢复您的工作目录

git reset --hard

列出您的所有分支机构

git branch -al

答案 38 :(得分:0)

这是一个跨平台的 PowerShell 7 函数,它是根据先前的答案改编而成的。

function Invoke-GitCloneAll($url) {
    $repo = $url.Split('/')[-1].Replace('.git', '')
    $repo_d = Join-Path $pwd $repo
    if (Test-Path $repo_d) {
        Write-Error "fatal: destination path '$repo_d' already exists and is not an empty directory." -ErrorAction Continue
    } else {
        Write-Host "`nCloning all branches of $repo..."
        git -c fetch.prune=false clone $url -q --progress &&
        git -c fetch.prune=false --git-dir="$(Join-Path $repo_d '.git')" --work-tree="$repo_d" pull --all
        Write-Host "" #newline
    }
}

注意: -c fetch.prune=false使它包括通常会被排除的陈旧分支,如果您对此不感兴趣,请将其删除。


您可以通过从功能中删除&&来使用PowerShell 5.1(Windows 10中的默认设置),但是即使上一条命令失败,它也会尝试运行git pull。因此,我强烈建议您仅使用跨平台的PowerShell,因为它总是困扰您尝试。

答案 39 :(得分:0)

对于使用vscode的开发人员来说,更好的替代解决方案是使用Git Shadow Extension。这个vscode扩展名允许克隆存储库内容和目录,可以按分支名称或提交哈希对其进行过滤。这样,分支或提交可用作新项目的样板/模板。

答案 40 :(得分:0)

参加派对有点晚了,但我觉得这样做很有意思:

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

如果这样做不受欢迎,我很想知道。但是,到目前为止,这对我有用。

答案 41 :(得分:0)

这是一个bash脚本,用于将git项目的所有分支和标记作为快照提取到单独的文件夹中。

https://gist.github.com/hfossli/7562257

也许不是直接问到的,但有些人可能会来这里寻找这个解决方案。

答案 42 :(得分:-1)

所有分支

用于从Git项目下载所有分支的脚本

安装:

sudo git clone https://github.com/marceloviana/allBranches.git && sudo cp -rfv allBranches/allBranches.sh /usr/bin/allBranches && sudo chmod +x /usr/bin/allBranches && sudo rm -rf allBranches

准备好了!现在只需调用命令(allBranches),并告诉Git项目目录您要下载所有分支

使用

示例1:

~$ allBranches /var/www/myproject1/

示例2:

~$ allBranches /var/www/myproject2/

示例3(如果已经在项目目录中):

~$ allBranches ./

~$ allBranches .

查看结果:

git branch

参考:

存储库allBranches GitHub: https://github.com/marceloviana/allBranches

答案 43 :(得分:-2)

如果您使用BitBucket,则

您可以使用导入存储库,这将导入所有git历史记录(所有分支和提交)