当前位置:   article > 正文

如何获取所有 Git 分支_git 获取所有分支

git 获取所有分支

问:

我克隆了一个包含许多分支的 Git 存储库。但是,git branch 只显示一个:

$ git branch
* master

  • 1
  • 2
  • 3

我将如何在本地拉出所有分支,所以当我执行 git branch 时,它会显示以下内容?

$ git branch
* master
* staging
* etc...

  • 1
  • 2
  • 3
  • 4
  • 5

答1:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

TL;DR 答案

git branch -r | grep -v '\->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

  • 1
  • 2
  • 3
  • 4

(似乎 pull 会从所有遥控器中获取所有分支,但我总是先获取以确保。)

仅当服务器上存在本地分支未跟踪的远程分支时才运行第一个命令。

完整答案

您可以像这样从所有遥控器获取所有分支:

git fetch --all

  • 1
  • 2

它基本上是一个 power move。

fetch 更新远程分支的本地副本,因此这对于您的本地分支始终是安全的但是:

fetch 不会更新本地分支(跟踪远程分支);如果你想更新你的本地分支,你仍然需要拉每个分支。 fetch 不会创建本地分支(跟踪远程分支),您必须手动执行此操作。如果要列出所有远程分支: git branch -a

要更新跟踪远程分支的本地分支:

git pull --all

  • 1
  • 2

然而,这仍然是不够的。它仅适用于跟踪远程分支的本地分支。要跟踪所有远程分支,请执行此 oneliner BEFORE git pull --all:

git branch -r | grep -v '\->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

  • 1
  • 2

PS AFAIK git fetch --all 和 git remote update 是等效的。

Kamil Szot 的comment,人们发现它很有用。

我不得不使用: for remote in git branch -r;做 git 分支 --track ${remote#origin/} $remote;完成,因为您的代码创建了名为 origin/branchname 的本地分支,并且每当我提到它时,我都会得到“refname ‘origin/branchname’ 是模棱两可的。

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

对不起。我无法想象这是 OP 真正想要的。 'pull' 命令是 'fetch+merge',合并部分会将所有分支重叠在一起——留下一大堆。

该 fetch 不会创建新的远程分支,您仍需要使用 git checkout -b localname remotename/remotebranch 进行检查

我不得不使用 for remote in git branch -r; do git branch --track ${remote#origin/} $remote; done,因为您的代码创建了名为 origin/branchname 的本地分支,并且每当我提到它时,我都会得到“refname 'origin/branchname' 是模棱两可的。

我不知道我是否使用了不同版本的 GIT,但我不得不将脚本修改为 git pull --all; for remote in git branch -r | grep -v >; do git branch --track ${remote#origin/} $remote; done。更改去掉了 HEAD。

对于 Windows 用户:for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all

答2:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

列出远程分支:

git branch -r

  • 1
  • 2

要将远程分支检出为本地分支:

git checkout -b local_branch_name origin/remote_branch_name

  • 1
  • 2

当我发现上述问题时,这正是我所寻找的。我怀疑许多寻找如何拉取远程分支的人肯定不想将分支合并到他们当前的工作副本中,但他们确实想要一个与远程分支相同的本地分支。

即使分支在本地不可见,我也可以执行git checkout remotebranchname并且它可以工作。你的解决方案有什么区别?

它现在的默认行为。旧 git 版本并非如此。使用 git checkout remotebranchname 仅创建一个名为 remotebranchname 的新 unrelated 分支。

接受的答案做了一些根本不同的事情,坦率地说,我什至不明白为什么它被接受的答案

OP要求所有分支机构。这个答案只有一个。

答3:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

您将需要创建本地分支来跟踪远程分支。

假设您只有一个名为 origin 的远程,此代码段将为所有远程跟踪创建本地分支:

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

  • 1
  • 2

之后,git fetch --all 将更新远程分支的所有本地副本。

此外,git pull --all 将更新您的本地跟踪分支,但根据您的本地提交以及“合并”配置选项的设置方式,它可能会创建合并提交、快进或失败。

这加强了针对包含 shell 元字符的分支名称的解决方案(根据 Pinkeen 对另一个答案的评论),并避免虚假错误输出: git branch -r | grep -v -- ' -> ' |远程阅读时;执行 git branch --track "${remote#origin/}" "$remote" 2>&1 | grep -v '已经存在';完毕

您确定 git pull --all 会更新所有本地跟踪分支吗?据我所知,它只更新所有遥控器的当前分支。

做过这个。未创建与远程分支匹配的本地分支。什么是 git 命令,简单地说“如果它们不存在,则拉出所有创建本地分支的远程分支?”

@JosephK 也许你的遥控器不叫origin?请参阅适用于所有远程名称的 this answer。

@TomHale这是“起源”,但感谢您的回答-尽管很疯狂,要做应该是一个或两个标志的事情还是很必要的。我现在正在尝试 gitless,试图避免 git 某些方面的疯狂。

答4:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

如果你这样做:

git fetch origin

  • 1
  • 2

然后他们将都在当地。如果您随后执行:

git branch -a

  • 1
  • 2

你会看到它们被列为远程/来源/分支名称。由于他们在当地,您可以随心所欲地对待他们。例如:

git diff origin/branch-name 

  • 1
  • 2

或者

git merge origin/branch-name

  • 1
  • 2

或者

git checkout -b some-branch origin/branch-name

  • 1
  • 2

刚刚在谷歌上找到了这个页面......这是我正在寻找的实际答案类型。我尝试了第一个命令,但收到一个错误:[$ git fetch --all origin fatal: fetch --all does not take a repository argument] --- 使用“git fetch --all”似乎可以解决问题。感谢领导!

已修复(已删除 --all)

git fetch -all 获取所有遥控器的所有分支。 git fetch origin 获取远程 origin 的所有分支。后者是OP所要求的。

--all 表示“所有遥控器”,而不是“给定遥控器的所有分支”。从远程获取的任何内容都暗示了后者。

这不是将所有分支从远程仓库拉入本地仓库的方法。

答5:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

$ git remote update
$ git pull --all

  • 1
  • 2
  • 3

这假设所有分支都被跟踪。

如果不是,您可以在 Bash 中触发:

for remote in `git branch -r `; do git branch --track $remote; done

  • 1
  • 2

然后运行命令。

当我尝试时,我仍然得到与上面相同的结果。

和@JacobLowe 一样,我得到了错误,但它仍然有效; '致命:一个名为'origin/master'的分支已经存在。'

这很难看,因为它会尝试为 -> 创建一个分支,该分支可能会作为 origin/HEAD -> 存在于 git branch -r 的输出中。原产地/主人``

而且,它不起作用。我得到输出:Branch 'origin/quote-filenames' set up to track local branch 'master'. 所需的输出是:Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'. 这是向后,设置原点以跟踪遥控器。有关修复,请参阅 this answer。

正是我需要的。由于我切换了 Mac,即使在我克隆了 repo 之后,我也无法签出其他远程分支,git fetch 也无法工作。所以这里的教训是你需要跟踪远程分支。格拉西亚斯!

答6:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

Bash for 循环对我不起作用,但这正是我想要的。我的所有分支都在本地镜像为同名。

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

  • 1
  • 2
  • 3

请参阅下面的 Mike DuPont 评论。我想我试图在 Jenkins 服务器上执行此操作,使其处于分离头模式。

在一个简单的克隆之后产生 fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository。必须先拆头。我用 git checkout 做了这个

我的解决方案是 git checkout --detach # detach the head,然后是 git fetch origin \'+refs/heads/*:refs/heads/*

这个对我有用,除了我也使用 --tags 参数。我希望 git 有一个标准的、简单的前端,git 中需要 10 多个堆栈溢出答案的简单事情的数量是荒谬的!

@kristianp 你检查过 Ungit 或 GitKraken 吗?

@Pegues 我认为很多困惑在于跟踪的工作原理以及它在更新本地存储库中的作用。你是正确的,这篇文章中的命令确实做了一个提取,但如果你不跟踪分支,它就不会提取它们。我想我对初学者的评论更多。 - 您提到的更新分支的方式也是 100% 合法的,但也有其他方法^^

答7:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

使用 git fetch && git checkout RemoteBranchName。

它对我来说效果很好…

这是新的最佳答案,你们大家。我不知道这在以前是否不可能,但最近版本的 Git 至少会注意到您正在尝试签出远程分支并会自动为您设置本地跟踪分支(并且您不需要指定 origin/branch;只需说 branch)。

这并没有回答最初的问题:“我如何将所有分支拉到本地?”它一个接一个地拉它们,这是不可扩展的。

这是让我在遇到的每种情况下都能拉出远程分支的唯一答案

答8:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

当您克隆存储库时,实际上会下载分支的所有信息,但分支是隐藏的。用命令

$ git branch -a

  • 1
  • 2

您可以显示存储库的所有分支,并使用命令

$ 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”命令查看。第二步,通过将 git 配置的布尔值“bare”切换为 false,将此存储库从空(裸)存储库切换到常规存储库:$ git config --bool core.bare false 第三步获取当前文件夹中的所有内容并在本地机器上创建所有分支,因此使它成为一个正常的 repo。 $ git reset --hard

所以现在您只需键入命令 git branch 即可看到所有分支都已下载。

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

赞成提及隐藏的分支。极大地帮助我了解了当地分支机构的跟踪。

这是一个很好的答案,但这个问题暗示了一些日常使用的东西。每次都克隆存储库是不切实际的。

为什么重置会在本地创建所有分支?

@Z.Khullah 创建所有分支的不是重置,而是克隆--mirror。对我们来说不幸的是,这也创建了一个裸仓库,这是第 2 步和第 3 步更改的内容。

答9:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

您可以通过以下方式获取所有分支:

git fetch --all

  • 1
  • 2

或者:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

  • 1
  • 2

如果您已浅化存储库,–depth=10000 参数可能会有所帮助。

要拉出所有分支,请使用:

git pull --all

  • 1
  • 2

如果上面不起作用,那么在上面的命令之前加上:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

  • 1
  • 2

因为 remote.origin.fetch 在获取时只能支持特定的分支,尤其是当您使用 --single-branch 克隆您的存储库时。通过以下方式检查:git config remote.origin.fetch。

之后,您应该能够签出任何分支。

也可以看看:

如何获取所有远程分支?

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

要将所有分支推送到远程,请使用:

git push --all

  • 1
  • 2

最终 --mirror 镜像所有参考。

如果您的目标是复制存储库,请参阅:GitHub 上的Duplicating a repository文章。

太棒了...在此页面中您的解决方案之前,我尝试了其他所有方法。非常感谢!

我使用了浅克隆 (depth=1),并且配置还为 fetch 指定了一个特定分支 - depth=1000 参数是帮助我签出特定远程分支的修复程序

pull --all 不会拉所有分支,而是拉所有遥控器

不过,配置的好技巧!会一直把它们全部拿走

我检查了你写的配置,仍然只适用于当前分支。看起来这里的所有答案都对我不起作用......

答10:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

我通常只使用这样的命令:

git fetch origin
git checkout --track origin/remote-branch

  • 1
  • 2
  • 3

稍微短一点的版本:

git fetch origin
git checkout -t origin/remote-branch

  • 1
  • 2
  • 3

答11:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

您看不到远程分支,因为您没有跟踪它们。

确保您正在跟踪所有远程分支(或您要跟踪的任何分支)。更新您的本地分支以反映远程分支。

跟踪所有远程分支:

跟踪远程仓库中存在的所有分支。

手动执行:

您可以将 替换为从 git branch -r 的输出中显示的分支。

git branch -r
git branch --track 

  • 1
  • 2
  • 3

使用 bash 脚本执行此操作:

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

  • 1
  • 2

懒惰的方式(由于合并冲突,这可能会造成混乱,请小心):

git checkout master
git pull

  • 1
  • 2
  • 3

更新有关本地计算机上远程分支的信息:

这会从您在本地存储库中跟踪的远程存储库中获取分支上的更新。这不会改变您当地的分支机构。您的本地 git repo 现在知道远程 repo 分支上发生的事情。一个例子是,一个新的提交已经被推送到远程主控,现在做一个提取会提醒你你的本地主控落后了 1 个提交。

git fetch --all

  • 1
  • 2

在本地计算机上更新有关远程分支的信息并更新本地分支:

对从远程分支到本地分支的所有分支进行提取,然后合并。一个例子是,一个新的提交已经被推送到远程 master,执行 pull 将更新你的本地 repo 关于远程分支中的更改,然后它将这些更改合并到你的本地分支中。由于合并冲突,这可能会造成相当混乱。

git pull --all

  • 1
  • 2

单字符变量令人困惑。我建议for remoteBranch in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${remoteBranch#*/} $remoteBranch; done

通过使用 xargs 而不是 for 循环,您根本不需要任何变量。

@bjhend 你能写一个例子,我很乐意更新!

@basickarl 我会用 git branch -r | grep -vE "HEAD|master" | xargs -I remoteBranch -n 1 echo ...remoteBranch... 之类的东西替换循环,用 git branch 命令替换 echo 但我现在看到删除 remoteBranch 中的远程将需要某种 sed 命令可能会使它更多复杂。

这似乎给我造成了混乱。我相信需要提到的是,在每一轮命令之前,需要检查一个适当的分支。

原文链接:https://www.huntsbot.com/qa/EVxV/how-to-fetch-all-git-branches?lang=zh_CN&from=csdn

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/774412
推荐阅读
相关标签
  

闽ICP备14008679号