ChatGPT解决这个技术问题 Extra ChatGPT

如何获取所有 Git 分支

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

$ git branch
* master

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

$ git branch
* master
* staging
* etc...
此问题说明如何在克隆时使用 --single-branch 设置后获取所有分支:stackoverflow.com/questions/17714159/…(如果您只指定了一个分支,git fetch --all 将永远无法工作!)
您将永远看不到该输出,因为星号表示当前正在结帐的分支。由于一次只能签出一个分支,因此您的分支列表左侧只能有一个星号。
我看到了很多答案,但没有一个提到我认为可能是做你想做的最简单的方法:git clone --bare <repo url> .git (注意你需要在最后添加“--bare”和“.git”来克隆repo 作为“bare” repo),然后是 git config --bool core.bare false(将“bare”标志设置为 false),然后是 git reset --hard(将 HEAD 移动到 repo 上的当前 HEAD)。现在,如果您git branch,您应该会看到您克隆的 repo 中的所有分支。
@GabrielFerraz那么您正在滥用Stack Overflow上的评论功能。用户可以支持您的评论,但不能反对。

a
alper

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

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

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

完整答案

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

git fetch --all

它基本上是一个 power move

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

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

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

git pull --all

然而,这仍然是不够的。它仅适用于跟踪远程分支的本地分支。要跟踪所有远程分支,请执行此 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

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

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

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


对不起。我无法想象这是 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
M
Mateen Ulhaq

列出远程分支:

git branch -r

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

git checkout -b local_branch_name origin/remote_branch_name

当我发现上述问题时,这正是我所寻找的。我怀疑许多寻找如何拉取远程分支的人肯定不想将分支合并到他们当前的工作副本中,但他们确实想要一个与远程分支相同的本地分支。
即使分支在本地不可见,我也可以执行git checkout remotebranchname并且它可以工作。你的解决方案有什么区别?
它现在的默认行为。旧 git 版本并非如此。使用 git checkout remotebranchname 仅创建一个名为 remotebranchname 的新 unrelated 分支。
接受的答案做了一些根本不同的事情,坦率地说,我什至不明白为什么它被接受的答案
OP要求所有分支机构。这个答案只有一个。
U
Undo

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

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

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

之后,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 某些方面的疯狂。
G
GoZoner

如果你这样做:

git fetch origin

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

git branch -a

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

git diff origin/branch-name 

或者

git merge origin/branch-name

或者

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

刚刚在谷歌上找到了这个页面......这是我正在寻找的实际答案类型。我尝试了第一个命令,但收到一个错误:[$ 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 表示“所有遥控器”,而不是“给定遥控器的所有分支”。从远程获取的任何内容都暗示了后者。
这不是将所有分支从远程仓库拉入本地仓库的方法。
P
Peter Mortensen
$ git remote update
$ git pull --all

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

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

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

然后运行命令。


当我尝试时,我仍然得到与上面相同的结果。
和@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 也无法工作。所以这里的教训是你需要跟踪远程分支。格拉西亚斯!
P
Peter Mortensen

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

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

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


在一个简单的克隆之后产生 fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository。必须先拆头。我用 git checkout <SHA> 做了这个
我的解决方案是 git checkout --detach # detach the head,然后是 git fetch origin \'+refs/heads/*:refs/heads/*
这个对我有用,除了我也使用 --tags 参数。我希望 git 有一个标准的、简单的前端,git 中需要 10 多个堆栈溢出答案的简单事情的数量是荒谬的!
@kristianp 你检查过 Ungit 或 GitKraken 吗?
@Pegues 我认为很多困惑在于跟踪的工作原理以及它在更新本地存储库中的作用。你是正确的,这篇文章中的命令确实做了一个提取,但如果你不跟踪分支,它就不会提取它们。我想我对初学者的评论更多。 - 您提到的更新分支的方式也是 100% 合法的,但也有其他方法^^
P
Peter Mortensen

使用 git fetch && git checkout RemoteBranchName

它对我来说效果很好......


这是新的最佳答案,你们大家。我不知道这在以前是否不可能,但最近版本的 Git 至少会注意到您正在尝试签出远程分支并会自动为您设置本地跟踪分支(并且您不需要指定 origin/branch;只需说 branch)。
这并没有回答最初的问题:“我如何将所有分支拉到本地?”它一个接一个地拉它们,这是不可扩展的。
这是让我在遇到的每种情况下都能拉出远程分支的唯一答案
u
unor

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

$ 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 第三步获取当前文件夹中的所有内容并在本地机器上创建所有分支,因此使它成为一个正常的 repo。 $ git reset --hard

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

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


赞成提及隐藏的分支。极大地帮助我了解了当地分支机构的跟踪。
这是一个很好的答案,但这个问题暗示了一些日常使用的东西。每次都克隆存储库是不切实际的。
为什么重置会在本地创建所有分支?
@Z.Khullah 创建所有分支的不是重置,而是克隆--mirror。对我们来说不幸的是,这也创建了一个裸仓库,这是第 2 步和第 3 步更改的内容。
k
kenorb

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

git fetch --all

或者:

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

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

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

git pull --all

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

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

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

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

也可以看看:

如何获取所有远程分支?

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

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

git push --all

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

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


太棒了...在此页面中您的解决方案之前,我尝试了其他所有方法。非常感谢!
我使用了浅克隆 (depth=1),并且配置还为 fetch 指定了一个特定分支 - depth=1000 参数是帮助我签出特定远程分支的修复程序
pull --all 不会拉所有分支,而是拉所有遥控器
不过,配置的好技巧!会一直把它们全部拿走
我检查了你写的配置,仍然只适用于当前分支。看起来这里的所有答案都对我不起作用......
m
marioosh

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

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

稍微短一点的版本:

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

b
basickarl

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

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

跟踪所有远程分支:

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

手动执行:

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

git branch -r
git branch --track <branch>

使用 bash 脚本执行此操作:

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

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

git checkout master
git pull

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

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

git fetch --all

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

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

git pull --all

单字符变量令人困惑。我建议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 命令可能会使它更多复杂。
这似乎给我造成了混乱。我相信需要提到的是,在每一轮命令之前,需要检查一个适当的分支。
i
ingyhere

如果您在这里寻求一种解决方案来获取所有分支,然后将所有内容迁移到另一个 Git 服务器,我将以下过程放在一起。如果您只想在本地更新所有分支,请在第一个空行处停止。

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master|main/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

非常有帮助;正是我需要的。我唯一需要改变的是在第二行,在“HEAD”和“master”周围添加了单引号;可能是因为我使用的是 zsh。谢谢!
这基本上是在做以下事情:(1)获取远程分支的实际名称[不是head,不是master]; (2) 完全告诉 Git 跟踪它们[并非所有解决方案都这样做]; (3) 从这些分支中获取和拉取所有内容[包括标签]; (4) 设置新的原点,通过绝对推高一切。同样,大多数其他解决方案都无法移动所有部分。这一切。
我删除了运行 grep 然后 awk 的反模式,并将 grep 命令压缩为 awk 命令。谢谢tripleee
阅读这篇文章,不要写 git fetch git pull stackoverflow.com/a/292359/1114926
Git pull 确实首先执行了 fetch,但当 fetch 独立执行时,更容易判断问题是来自 pullfetch 部分还是 pull 的后续 merge 部分。
P
Peter Mortensen

我相信您已经通过以下方式克隆了存储库:

git clone https://github.com/pathOfrepository

现在使用 cd 转到该文件夹:

cd pathOfrepository

如果您输入 git status,您可以看到所有内容:

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

查看所有隐藏的分支类型:

 git branch -a

它将列出所有远程分支。

现在,如果您想在任何特定分支上结帐,只需键入:

git checkout -b localBranchName origin/RemteBranchName

A
Ahmad

确保所有远程分支都可以在 .git/config 文件中获取。

在此示例中,只有 origin/production 分支是可获取的,即使您尝试执行 git fetch --all,除了获取 production 分支之外什么也不会发生:

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

此行应替换为:

[origin]
fetch = +refs/heads/*:refs/remotes/origin/*

然后运行 git fetch 等...


检查:git config --get remote.origin.fetch,然后(破坏性地)设置它:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
或修改 .git 目录中的配置文本文件,为我工作
e
eebbesen

克隆主存储库后,您只需执行

git fetch && git checkout <branchname>

简单的。并努力从远程获取一个分支
这并没有回答最初的问题:“我如何将所有分支拉到本地?”它一个接一个地拉它们,这是不可扩展的。考虑 100 个分支的情况。
P
Peter Mortensen

只需这三个命令即可获取所有分支:

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard

这实际上是OP问题的根源。如果克隆正确,他就不需要执行 pull --all。但是如果仍然需要,那么下面的另一个答案,@Johnno Nola,假设所有分支都被跟踪,与这个答案混合,是要走的路。
G
Greg Weigner

如何获取跟踪单个远程的所有 Git 分支。

这已经在 Windows 10 上的 Red Hat 和 Git Bash 上进行了测试和功能。

TLDR:

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

解释:

一个班轮签出,然后获取除 HEAD 之外的所有分支。

列出远程跟踪分支。

git branch -r

忽略头。

grep -v ' -> '

从遥控器中取出分支名称。

cut -d"/" -f2

结帐跟踪单个遥控器的所有分支机构。

git checkout $branch

获取已签出的分支。

git fetch

从技术上讲,新的本地分支不需要获取。

这可以用于 fetchpull 分支,它们都是新的并且在远程中有更改。

只需确保仅在准备合并时才拉动。

测试设置

使用 SSH URL 查看存储库。

git clone git@repository.git

检查当地的分支机构。

$ git branch
* master

执行命令

执行一个班轮。

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

检查本地分支是否包括远程分支。

$ git branch
  cicd
  master
* preprod

p
poxion

循环似乎对我不起作用,我想忽略起源/主人。这对我有用。

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

在那之后:

git fetch --all
git pull --all

这是正确答案的一种变体,但它并不适用于所有边缘情况。此外,分支名称可能很时髦。所以我做了以下事情: git branch -r | grep -v 头 | grep –v 大师 | awk -F'origin/' '{打印 $2 " " $1"origin/"$2}' | xargs -L 1 git 分支 -f --track ; git fetch --all ; git pull --all ;这就是诀窍!
避免 grep | awk antipattern: git branch -r | awk -F 'origin/' '!/HEAD|master/{ ...
u
ujeenator

对于使用 PowerShell 的 Windows 用户:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*?/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}; git fetch --all; git pull --all

这适用于名称中带有 / 的分支:git branch -r | ForEach-Object { # Skip default branch, this script assumes # you already checked-out that branch when cloned the repo if (-not ($_ -match " -> ")) { $localBranch = ($_ -replace "^.*?/", "") $remoteBranch = $_.Trim() git branch --track "$localBranch" "$remoteBranch" } }
T
Trake Vital

设置别名:(根据置顶答案)

git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

现在跟踪所有分支:

git track-all-branches


t
tstone2077

我写了一个小脚本来管理克隆一个新的 repo 并为所有远程分支创建本地分支。

您可以找到最新版本 here

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

要使用它,只需将其复制到您的 git bin 目录(对我来说,就是 C:\Program Files (x86)\Git\bin\git-cloneall),然后在命令行上:

git cloneall [standard-clone-options] <url>

它像往常一样克隆,但为所有远程分支创建本地跟踪分支。


T
Tom Hale

这是我认为可靠的东西:

不更新现有分支机构的远程跟踪

不尝试更新 HEAD 以跟踪原点/HEAD

允许命名为 origin 以外的遥控器

正确引用外壳

for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

不需要 git fetch --all,因为将 -all 传递给 git pull 会将此选项传递给内部 fetch

归功于 this answer


我正在尝试用另一种脚本语言(Typescript)复制它,但不理解 bash 语法 ${b#*/} - 有人可以解释一下含义吗?
找到了一个有用的资源 devhints.io/bash,它显示 ${STR#*/} 扩展为 STR 的完整路径(即上述代码中的 b)。
另请注意,在 Windows cmd 提示符下,git branch -r --format='%(refname:short)' 将输出引号 ('),因此请使用双引号:git branch -r --format="%(refname:short)"
P
Peter Mortensen

如果您对 fetch --all 有问题,请跟踪您的远程分支:

git checkout --track origin/%branchname%

山茶树和葡萄树
|‾‾‾‾‾‾‾‾‾‾‾‾‾fetch/clone‾‾‾‾‾‾‾‾‾‾‾‾↓   |‾‾‾‾‾‾‾‾‾‾‾‾checkout‾‾‾‾‾‾‾‾‾‾↓   
|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾pull‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾↓
Remote repository (`origin`) <=> Local repository <=> Index <=> Workspace
↑_________________push_______________|   ↑____commit____|  ↑____add_____| 

# 拉取远程仓库所有分支信息 → 本地仓库
# fetch all remote repository branch meta → local repository
git remote set-branches origin '*'
git fetch -v

# 把所有远程分支数据搞到本地
# fetch all remote repository branch data → local repository
git branch -r | grep -v '\->' | while read remote; do git branch "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

这是对我有用的答案!
d
dave4jr

您可以通过这一行命令获取所有分支,如下所示:

git fetch --all && git pull --all && git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

a
anhlc

我们可以将所有分支或标签名称放在一个临时文件中,然后为每个名称/标签执行 git pull:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done

J
Jose Quijada

这是接受的答案中提供的单行代码的 Perl 版本:

git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

如果您愿意,可以将输出文件作为 Shell 脚本运行。

我们无意中删除了我们的 Stash 项目存储库。幸运的是,有人在意外丢失之前创建了一个分叉。我将叉子克隆到我的本地(将省略我如何做到这一点的细节)。一旦我将叉子完全放在本地,我就跑了一个单线。我修改了远程的 URL(在我的例子中是源)指向我们正在恢复的目标存储库:

git remote set-url origin <remote-url>

最后将所有分支推到原点,如下所示:

git push --all origin

我们又开始营业了。


b
bfontaine

尝试了很多方法,只有这个简单并且对我有用。

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done

C
ChrisZZ

为避免错误消息“致命:名为 'origin/master' 的分支已存在。”,您可以尝试我的解决方案:

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done

e
erikano

根据 Learath2 的回答,这是我在执行 git clone [...]cd 进入创建的目录后所做的:

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

为我工作,但我不知道它会为你工作。当心。