Git 推送本地所有分支和拉取远程所有分支

本文详细介绍了如何在Windows 10的Ubuntu子系统中设置Git服务器,通过SSH证书登录实现与macOS之间的源码同步。内容覆盖了远程GitServer的初始化、bare仓库的创建、本地仓库远程路径的添加、分支的推送与克隆,以及如何通过脚本批量检查和更新远程分支。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是另外一篇博文 Win10 Ubuntu子系统设置Git服务器和SSH Server 证书登录,实现win10和macOS源码同步 的一部分,单独拿出来说一下:

首先,设置好远程Git Server的ssh证书登录,假设用户名是git,远程服务器Host设置为nas (具体设置参考上述博文);

其次,设置好 ssh-agent 自启动,具体参考 Win10 cmd命令行,Powershell,Linux子系统Ubuntu bash自动启动ssh-agent

1. 推送本地所有分支

1.1 首先在远程服务器上初始化一个bare仓库,

$ sudo git init --bare smartlight.git

1.2 输入密码就可以看到初始化信息了

[sudo] password for git:
Initialized empty Git repository in /mnt/f/gitRepo/smartlight.git/

1.3 本地仓库添加remote路径

git remote add origin ssh://git@nas/mnt/f/gitRepo/smartlight.git

推送方法1:git push --all origin

$ git push --all origin -u

即可以看到类似下面的信息

Counting objects: 232, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (214/214), done.
Writing objects: 100% (232/232), 8.08 MiB | 2.08 MiB/s, done.
Total 232 (delta 37), reused 0 (delta 0)
remote: Resolving deltas: 100% (37/37), done.
To ssh://nas/mnt/f/gitRepo/Smartlight.git
 * [new branch]      master -> master

将来再次push简单使用 git push 即可。

git push

 

 

推送方法2:git push --mirror

$ git push --mirror

 

 2. 首次克隆远程所有分支(mac)

注意,简单使用git clone 理论上已经获取远程的所有分支,但是如果你此时输入 git branch -a ,只能看到本地的master分支和remote的所有分支,如果你要在本地显示每个分支,需要分别checkout到相应的同名分支上。很遗憾git没有提供一个内置的功能让你一次性做这个事情,所以需要创建一个脚本。(以本人的macOS的zsh shell为例)。虽然 git clone 有一个 --mirror 参数,但是这个参数会让你完全复制 git server 的整个目录结构,它并不是你原先的工作目录结构。

2.1 首先,在shell profile (~/.zshrc)里面建立一个函数gclone(),方便将来使用,使用函数是因为通常bash里的alias不支持传递参数:

function gclone(){
    git clone ssh://git@nas/mnt/f/gitRepo/$1.git
}

 2.2 其次,source 使其生效。

>source ~/.zshrc 

2.3 然后,在~/目录创建一个脚本gpa.sh (gpa是git pull all的缩写),内容是

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

2.4 给gpa.sh添加执行权限:

>chmod +x ~/gpa.sh

2.5 现在开始克隆远程仓库,输入 gclone smartlight ,

这个函数命令相当于 git clone ssh://git@nas/mnt/f/gitRepo/smartlight.git 

>gclone smartlight

Cloning into 'smartlight'...
remote: Counting objects: 232, done.
remote: Compressing objects: 100% (177/177), done.
remote: Total 232 (delta 37), reused 232 (delta 37)
Receiving objects: 100% (232/232), 8.08 MiB | 4.90 MiB/s, done.
Resolving deltas: 100% (37/37), done.

2.6 然后切换到这个目录

>cd smartlight

2.7 运行gpa.sh即可

>gpa.sh

3. 再次拉取所有分支(包括新建分支)

(windows需要在git bash中运行)

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

补充:git fetch -all 似乎可以一次性获取远程分支?

 

 

参考文献:

1. ZSH alias with parameter

2. How to clone all remote branches in Git?

3. How to fetch all Git branches

 

<think>我们正在处理用户关于Git的问题:用户希望将远程仓库中的dev分支本地,并建立与远程分支的关联。 根据引用[2]中的信息,有一个命令可以直接实现:`git checkout --track <远程仓库名>/<远程分支名>`,例如:`git checkout --track origin/dev`。 另外,引用[3]中提到的方法:`git checkout -b 新分支名` 然后推送远程,但这里用户要求直接远程已存在的dev分支并关联。 因此,我们可以提供以下两种方法: 方法1:使用`git checkout --track origin/dev`(这是最直接的方式) 方法2:先创建本地分支并切换到该分支,然后设置上游分支(即关联远程分支),步骤如下: 1. 创建并切换到本地dev分支:`git checkout -b dev` 2. 设置远程分支关联:`git branch --set-upstream-to=origin/dev dev` 或者,在的时候也可以直接建立关联,但需要先确保本地分支存在并且已经关联,或者使用`git pull`的时候指定。 但是,根据引用[2]的描述,方法1是最简洁的,它会自动创建与远程分支同名的本地分支,并设置跟踪(关联)。 另外,引用[1]中提到的是通过idea来操作,但用户没有指定使用工具,所以我们以命令行方式回答。 注意:在执行这些命令之前,请确保远程仓库中确实存在dev分支。 因此,回答如下: 1. 使用命令 `git checkout --track origin/dev` 可以直接远程dev分支并在本地创建同名的分支(dev),同时建立关联(跟踪)关系。 2. 如果本地已经有一个dev分支,但还没有关联远程分支,可以使用 `git branch -u origin/dev dev` 来设置关联。 步骤详细说明: - 首先,使用 `git fetch` 可以获远程的最新分支信息(如果已经知道远程有dev分支,可以省略,因为checkout --track也会自动fetch)。 - 然后,执行 `git checkout --track origin/dev`。 如果用户想要在创建分支时使用不同的本地分支名,可以使用: `git checkout -b 本地分支名 origin/dev` 这样就会以远程dev分支为起点创建新的本地分支(名字可以不同),并自动建立跟踪关系。 但是,用户要求本地分支名为dev(与远程相同),所以第一种方法即可。 注意:如果远程分支不存在,命令会失败。所以请确保远程仓库有dev分支。 另外,如果用户已经远程分支信息(比如执行过`git fetch`),那么也可以直接使用`git checkout dev`,如果本地没有dev分支,但是远程有,并且有唯一匹配,git会自动创建一个跟踪分支。但是为了明确,建议使用--track。 生成相关问题: 1. 如何查看本地分支远程分支的关联关系? 2. 如果远程分支不存在,该如何处理? 3. 如何远程其他分支(非dev)到本地?</think>### Git 远程 dev 分支本地并关联 以下是两种常用方法(命令行操作): #### 方法 1:直接创建关联分支(推荐) ```bash # 创建本地 dev 分支并关联远程 origin/dev git checkout --track origin/dev ``` - ✅ **作用**:自动创建同名本地分支,建立跟踪关系 - ✅ **优势**:一步完成分支创建关联,自动同步远程分支最新状态[^2] #### 方法 2:分步操作 ```bash # 1. 获远程分支信息 git fetch origin # 2. 创建并切换到本地 dev 分支 git checkout -b dev # 3. 关联远程分支 git branch --set-upstream-to=origin/dev dev ``` #### 验证关联状态 ```bash git branch -vv ``` 输出示例: ```bash * dev 7a3b1cd [origin/dev] Fix login bug # 方括号内表示关联的远程分支 ``` ### 注意事项 1. **远程分支必须存在**:执行前确保远程仓库有 `dev` 分支 2. **冲突处理**:若本地已有 `dev` 分支,需先删除: `git branch -D dev && git checkout --track origin/dev` 3. **首次关联后同步**:建立关联后使用 `git pull` 即可自动同步远程更改 > 通过 `git remote show origin` 可查看所有分支跟踪关系[^1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值