#!/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
24 回答
bash for循环对我来说不起作用,但这完全符合我的要求 . 来自我的所有分支在本地镜像为相同的名称 .
编辑:见下面的Mike DuPont评论 . 我想我试图在Jenkins服务器上执行此操作,使其处于分离头模式 .
克隆存储库时,实际下载了分支的所有信息,但隐藏了分支 . 随着命令
您可以显示存储库的所有分支,并使用该命令
然后,您可以一次手动“下载”它们 .
然而,有一种更清洁,更快捷的方式,虽然它有点复杂 . 您需要三个步骤来完成此任务:
在您的计算机上创建一个新的空文件夹,并从存储库中克隆.git文件夹的镜像副本:
文件夹my_repo_folder中的本地存储库仍为空,现在只有一个隐藏的.git文件夹,您可以从终端看到“ls -alt”命令 .
通过将git配置的布尔值“裸”切换为false,将此存储库从空(裸)存储库切换到常规存储库:
抓取当前文件夹中的所有内容并在本地计算机上创建所有分支,从而使其成为正常的repo .
所以现在你可以输入命令
git branch
,你可以看到所有的分支都被下载了 .这是您可以快速克隆包含所有分支的git存储库的快速方法,但这不是您希望以这种方式为每个项目执行的操作 .
如果你这样做:
然后他们将在当地 . 如果你然后执行:
你会看到它们被列为遥控器/原点/分支名称 . 因为他们在当地,你可以随心所欲地做任何事情 . 例如:
要么
要么
这是在接受的答案中提供的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
我们又回来了 .
您需要创建跟踪远程分支的本地分支 .
假设您只有一个名为
origin
的遥控器,此片段将为所有远程跟踪的远程创建本地分支:之后,
git fetch --all
将更新远程分支的所有本地副本 .此外,
git pull --all
将更新本地跟踪分支,但根据您的本地提交以及如何设置'merge' configure选项,它可能会创建合并提交,快进或失败 .我写了一个小脚本来管理克隆新的repo并为所有远程分支创建本地分支 .
你可以找到最新版本here:
要使用它,只需将其复制到您的git bin目录(对我来说,那是
C:\Program Files (x86)\Git\bin\git-cloneall
),然后在命令行上:它像往常一样克隆,但为所有远程分支创建本地跟踪分支 .
对于使用PowerShell的Windows用户:
循环似乎对我不起作用,我想忽略原点/主人 . 这对我有用 .
之后:
现在本地你的
yourNewLocalBranchName
就是你的requiredRemoteBranch
.只有这三个命令将获得所有分支
我相信你已经克隆了存储库
现在使用cd转到该文件夹
如果输入
git status
你可以看到所有
查看所有隐藏的分支类型
它将列出所有远程分支
现在,如果您想要在任何特定分支上结账,只需输入
这假定跟踪所有分支 .
如果不是,你可以在Bash中解雇:
然后运行该命令 .
我通常只使用这样的命令:
更短的版本:
如果您在这里寻求获得所有分支的解决方案,然后将所有内容迁移到另一个Git服务器,我将以下过程放在一起 . 如果您只想在本地更新所有分支,请在第一个空行停止 .
如果你有fetch --all的问题
然后跟踪您的远程分支
git checkout --track origin /%branchname%
这是我认为强大的东西:
不更新现有分支的远程跟踪
不尝试更新
HEAD
以跟踪origin/HEAD
允许名为
origin
以外的遥控器正确引用shell
它的没有必要
git fetch --all
传递-all
到git pull
将此选项传递给内部fetch
.感谢this answer .
根据Learath2的回答,这是我在创建目录后
git clone [...]
和cd
-ing所做的事情:git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b
为我工作,但我不知道它对你有用 . 小心 .
您可以通过以下方式获取所有分支:
要么:
如果您使存储库变浅,则--depth = 10000参数可能会有所帮助 .
要拉出所有分支,请使用:
如果以上不起作用,则在上面的命令之前加上:
因为
remote.origin.fetch
在获取时只能支持特定的分支,特别是当你用--single-branch
克隆你的回购时 . 通过以下方式检查:git config remote.origin.fetch
.之后你应该能够结账任何分支机构 .
也可以看看:
How to fetch all remote branches?
How to clone all remote branches in Git?
要将所有分支推送到远程,请使用:
最终
--mirror
镜像所有参考 .如果您的目标是复制存储库,请参阅:GitHub上的文章Duplicating a repository .
克隆主存储库后,您就可以执行了
确保
.git/config
文件中的所有远程分支都可以获取 .在此示例中,只有
origin/production
分支是可获取的,即使您尝试执行git fetch --all
也不会发生任何事情,只需获取production
分支:该行应替换为:
然后运行
git fetch
等...使用
git fetch && git checkout RemoteBranchName
.它对我来说效果很好......
我们可以将所有分支或标记名称放在一个临时文件中,然后为每个名称/标记执行git pull:
列出远程分支:
git branch -r
您可以将它们作为本地分支机构查看:
git checkout -b LocalName origin/remotebranchname
您可以从所有遥控器中获取一个分支,如下所示:
fetch
更新远程分支的本地副本,因此对于本地分支机构来说,这始终是安全的 BUT :fetch
不会 update 本地分支机构( track 远程分支机构);如果要更新本地分支,则仍需要拉出每个分支 .fetch
不会 create 本地分支机构( track 远程分支机构),您必须手动执行此操作 . 如果要列出所有远程分支:git branch -a
到 update 跟踪远程分支的本地分支:
但是,这仍然不够 . 它仅适用于跟踪远程分支的本地分支 . 要跟踪所有远程分支,请执行此oneliner BEFORE
git pull --all
:TL; DR版本
(似乎拉取所有遥控器的所有分支,但我总是首先获取以确定)
仅当服务器上存在未由本地分支跟踪的远程分支时,才运行第一个命令 .
附: AFAIK
git fetch --all
和git remote update
是等价的 .Kamil Szot的comment,其中74人(至少)认为有用 .